自己的springboot的基本原理知識點梳理

springboot知識點複習梳理

導讀:springboot相比於ssm來說,就是將其中複雜的xml文件配置轉化成了java配置。
一、我們先來一個簡單的案例演示,通過Java配置的方式進行配置Spring,並且實現了Spring IOC功能。
1.首先 是pom文件的依賴導入

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>cn.itcast.springboot</groupId>
	<artifactId>itcast-springboot</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<packaging>war</packaging>
<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>4.3.7.RELEASE</version>
	</dependency>
	<!-- 連接池 -->
	<dependency>
		<groupId>com.jolbox</groupId>
		<artifactId>bonecp-spring</artifactId>
		<version>0.8.0.RELEASE</version>
	</dependency>
</dependencies>
<build>
	<finalName>${project.artifactId}</finalName>
	<plugins>
		<!-- 資源文件拷貝插件 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-resources-plugin</artifactId>
			<configuration>
				<encoding>UTF-8</encoding>
			</configuration>
		</plugin>
		<!-- java編譯插件 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>1.7</source>
				<target>1.7</target>
				<encoding>UTF-8</encoding>
			</configuration>
		</plugin>
	</plugins>
	<pluginManagement>
		<plugins>
			<!-- 配置Tomcat插件 -->
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
			</plugin>
		</plugins>
	</pluginManagement>
</build>
2.創建一個pojo對象user package cn.itcast.springboot.javaconfig; public class User { private String username; private String password; private Integer age; . . . } 3.編寫UserDao 模擬實現一個查詢數據庫方法 package cn.itcast.springboot.javaconfig;

import java.util.ArrayList;
import java.util.List;

public class UserDAO {

public List<User> queryUserList(){
    List<User> result = new ArrayList<User>();
    // 模擬數據庫的查詢
    for (int i = 0; i < 10; i++) {
        User user = new User();
        user.setUsername("username_" + i);
        user.setPassword("password_" + i);
        user.setAge(i + 1);
        result.add(user);
    }
    return result;
}

}

4.編寫Service用於實現User數據操作業務邏輯
package cn.itcast.springboot.javaconfig;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service //service註解,爲後面的掃描做準備
public class UserService {
@Autowired // 注入Spring容器中的bean對象
private UserDAO userDAO;

public List<User> queryUserList() {
    // 調用userDAO中的方法進行查詢
    return this.userDAO.queryUserList();
}

}
5.編寫SpringConfig 用於實例化Spring容器
@Configuration //通過該註解來表明該類是一個Spring的配置,相當於一個xml文件
@ComponentScan(basePackages = “cn.itcast.springboot.javaconfig”) //配置掃描包,用於掃描service
public class SpringConfig {

@Bean // 通過該註解來表明是一個Bean對象,相當於xml中的<bean>
public UserDAO getUserDAO(){
    return new UserDAO(); // 直接new對象做演示
}

}
6.編寫測試方法 用於啓動Spring容器
(1)本步重點: AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
通過此上下文的類來讀取剛纔實例化spring容器的類

public class Main {
    
    public static void main(String[] args) {
        // 通過Java配置來實例化Spring容器
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        
        // 在Spring容器中獲取Bean對象
        UserService userService = context.getBean(UserService.class);
        
        // 調用對象中的方法
        List<User> list = userService.queryUserList();
        for (User user : list) {
            System.out.println(user.getUsername() + ", " + user.getPassword() + ", " + user.getPassword());
        }
        
        // 銷燬該容器
        context.destroy();
    }

}

二、小案例實戰,用springboot的知識來取代ssm中的xml配置文件
1.創建一個類HelloApplication
(1)此類有三個註解:Controller SpringBootApplication Configuration
第一個註解表明此類是個控制層的類,可以用來處理邏輯;
第二個註解是核心,所有的springboot的啓動類都需要這個註解;
第三個註解又表明此類是個xml文件。

@Controller
@SpringBootApplication
@Configuration

public class HelloApplication {

(2)
1: @RequestMapping(value=“hello”)
訪問時的路徑映射
2:@ResponseBody
將controller的方法返回的對象通過適當的轉換器轉換爲指定的格式之後,寫入到response對象的body區,通常用來返回JSON數據或者是XML數據

@RequestMapping(value="hello")
@ResponseBody
public String hello(){
    return "hello world!傳智播客";
}

(3)@Bean
這一部分的引用Bean註解,相當於xml文件裏面的一個對象,來知名當前數據的編碼方式

@Bean
public StringHttpMessageConverter stringHttpMessageConverter(){
    StringHttpMessageConverter converter  = new StringHttpMessageConverter(Charset.forName("ISO-8859-1"));
    return converter;

}
(4)main方法
在每一個springboot的啓動類裏面一定要有一個main方法,用來啓動想要啓動的類
SpringApplication是前面註解的方法,調用當中的run方法,來啓動配置java類。

public static void main(String[] args) {
	SpringApplication.run(HelloApplication.class, args);
}

}
2.自定義攔截器
創建一個類來繼承WebMvcConfigurerAdapter

@Configuration //申明這是一個配置
public class MySrpingMVCConfig extends WebMvcConfigurerAdapter{
    // 自定義攔截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        HandlerInterceptor handlerInterceptor = new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                    throws Exception {
                System.out.println("自定義攔截器............");
                return true;
            }
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            
        }
        
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                Exception ex) throws Exception {
        }
    };
    registry.addInterceptor(handlerInterceptor).addPathPatterns("/**");
}

// 自定義消息轉化器的第二種方法
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    StringHttpMessageConverter converter  = new StringHttpMessageConverter(Charset.forName("UTF-8"));
    converters.add(converter);
}

}

三、springboot實現改造購物車。
1.導入依賴
(1)最爲重要的

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
	</parent>

在springboot的依賴中,父依賴必須要爲springboot的父依賴,不能用我們自己定義的父依賴,裏面包含了大量的配置。
(2)重要的

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

這是編寫web的時候要導入的springboot依賴。

2.創建java類代替xml文件
1.替換applicationContext-dao.xml
(1)創建TaotaoApplication類完成對數據庫連接訪問
解釋:1.@PropertySource註解是用來讀取properties文件的,
ignoreResourceNotFound = true 如果properties文件沒找到依舊執行,不會報錯。
2.@ComponentScan主要就是定義掃描的路徑從中找出標識了需要裝配的類自動裝配到spring的bean容器中,像@Controller,@Service,@Repository,@Component等註解都在掃描範圍內
3.
@Value("jdbc.url&quot;)privateStringjdbcUrl;stringjdbcUrl{jdbc.url}&quot;) private String jdbcUrl; 定義一個string類型的變量jdbcUrl,將其值賦值爲{jdbc.url},因爲前面的掃描已經讀取了jdbc.properties裏面的內容

@Configuration
@PropertySource(value={ "classpath:jdbc.properties", "classpath:env.properties","classpath:httpclient.properties"}, ignoreResourceNotFound = true)
@ComponentScan(basePackages="com.taotao")
public class TaotaoApplication {
	
	@Value("${jdbc.url}")
	private String jdbcUrl;
	
  @Value("${jdbc.driverClassName}")
    private String jdbcDriverClassName;

    @Value("${jdbc.username}")
    private String jdbcUsername;

    @Value("${jdbc.password}")
    private String jdbcPassword;
    
    @Bean(destroyMethod="close")
    public DataSource dataSource() {
    	BoneCPDataSource boneCPDataSource = new BoneCPDataSource();
    	boneCPDataSource.setDriverClass(jdbcDriverClassName);
        // 相應驅動的jdbcUrl
        boneCPDataSource.setJdbcUrl(jdbcUrl);
        // 數據庫的用戶名
        boneCPDataSource.setUsername(jdbcUsername);
        // 數據庫的密碼
        boneCPDataSource.setPassword(jdbcUsername);
        // 檢查數據庫連接池中空閒連接的間隔時間,單位是分,默認值:240,如果要取消則設置爲0
        boneCPDataSource.setIdleConnectionTestPeriodInMinutes(60);
        // 連接池中未使用的鏈接最大存活時間,單位是分,默認值:60,如果要永遠存活設置爲0
        boneCPDataSource.setIdleMaxAgeInMinutes(30);
        // 每個分區最大的連接數
        boneCPDataSource.setMaxConnectionsPerPartition(100);
        // 每個分區最小的連接數
        boneCPDataSource.setMinConnectionsPerPartition(5);
        return boneCPDataSource;

    }

這是以前xml文件的連接池

	<!-- 數據庫連接池 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
		destroy-method="close">
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="maxActive" value="10" />
		<property name="minIdle" value="5" />
	</bean>

2.創建一個類MyBatisConfig來代替mybatisxml配置
解釋: @ConditionalOnMissingBean 這個註解的意思就是 如果當前運行中沒有這個@Bean類 那麼就創建,如果有,則無所謂

@Configuration
public class MyBatisConfig {

	@Bean
	@ConditionalOnMissingBean
	public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
	     // 設置數據源
        sqlSessionFactoryBean.setDataSource(dataSource);
        // 設置mybatis的主配置文件
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource mybatisConfigXml = resolver.getResource("classpath:mybatis/mybatis-config.xml");
        sqlSessionFactoryBean.setConfigLocation(mybatisConfigXml);
        // 設置別名包
        sqlSessionFactoryBean.setTypeAliasesPackage("com.taotao.cart.pojo");

		return sqlSessionFactoryBean;
	}
}

這是以前xml文件的配置

<!-- 讓spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 數據庫連接池 -->
		<property name="dataSource" ref="dataSource" />
		<!-- 加載mybatis的全局配置文件 -->
		<property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />
	</bean>

3.創建一個類MapperScannerConfig代替以前xml配置中的mapper掃描

@Configuration
@AutoConfigureAfter(MyBatisConfig.class) //保證在MyBatisConfig實例化之後再實例化該類
public class MapperScannerConfig {
    
    // mapper接口的掃描器
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.taotao.cart.mapper");
        return mapperScannerConfigurer;
    }
}

這是以前xml文件的配置

	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.taotao.mapper" />
	</bean>

4.全局配置文件
創建一個文件application.propertirs
(1)server.port:8086 //指定當前運行的端口號

(2)server.servlet-path:/ 修改進入DispatcherServlet的規則爲:/

(3)如果進入SpringMVC的規則爲/時,Spring Boot的默認靜態資源的路徑爲:
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

(4)進入規則爲*.xxx 或者 不指定靜態文件路徑時
將靜態資源放置到webapp下的static目錄中即可通過地址訪問

5.Spring Boot的自動配置的原理
Spring Boot在進行SpringApplication對象實例化時會加載META-INF/spring.factories文件,將該配置文件中的配置載入到Spring容器。

6.設置事務管理
在Spring Boot中推薦使用@Transactional註解來申明事務。

首先需要導入依賴:

org.springframework.boot
spring-boot-starter-jdbc

當引入jdbc依賴之後,Spring Boot會自動默認分別注入DataSourceTransactionManager或JpaTransactionManager,所以我們不需要任何額外配置就可以用@Transactional註解進行事務的使用。

在Service中添加@Transactional註解:

圖一
7.設置SpringMVC的配置

在這裏插入圖片描述

6.4.1. 啓動錯誤1

關鍵錯誤(丟失了web容器的工廠,也就是說我們並沒有把它作爲一個web應用來啓動):
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.

解決:在這裏插入圖片描述

讓Spring Boot來自動選擇並且完成web的相關加載工作。
6.4.2. Slf4j日誌警告

在這裏插入圖片描述
提示我們當前的項目中slf4j引入了2個,導致了jar衝突。

解決:
1、 刪除自己引入到slf4j的依賴
在這裏插入圖片描述

2、 將taotao-common中傳遞的依賴排除掉

在這裏插入圖片描述
再次啓動,發現警告沒了:

6.4.3. 解決jsp訪問404的問題
由於Spring boot使用的內嵌的tomcat,而內嵌的tamcat是不支持jsp頁面的,所有需要導入額外的包才能解決。

org.apache.tomcat.embed tomcat-embed-jasper provided

6.4.4. 攔截器中的UserService空指針異常
分析:由於添加攔截器時,直接對UserLoginHandlerInterceptor進行new操作,導致UserService無法注入,所以有空指針異常。

解決:
在這裏插入圖片描述
在這裏插入圖片描述

  1. 發佈到獨立的tomcat中運行
    在開發階段我們推薦使用內嵌的tomcat進行開發,因爲這樣會方便很多,但是到生成環境,我希望在獨立的tomcat容器中運行,因爲我們需要對tomcat做額外的優化,這時我們需要將工程打包成war包發進行發佈。
    7.1. 工程的打包方式爲war
    在這裏插入圖片描述
    7.2. 將spring-boot-starter-tomcat的範圍設置爲provided
    設置爲provided是在打包時會將該包排除,因爲要放到獨立的tomcat中運行,是不需要的。
org.springframework.boot spring-boot-starter-tomcat provided 7.3. 修改代碼,設置啓動配置 需要集成SpringBootServletInitializer,然後重寫configure,將Spring Boot的入口類設置進去。 ![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20190120165856336.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N0cmVhbWxpbmVXcQ==,size_16,color_FFFFFF,t_70) 7.4. 打war包 ![在這裏插入圖片描述](https://img-blog.csdnimg.cn/2019012016590463.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N0cmVhbWxpbmVXcQ==,size_16,color_FFFFFF,t_70)

打包成功:
在這裏插入圖片描述
7.5. 部署到tomcat
解壓apache-tomcat-7.0.57.tar.gz,將war包解壓到webapps下的ROOT目錄中,啓動:

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章