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},因爲前面的掃描已經讀取了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頁面的,所有需要導入額外的包才能解決。
6.4.4. 攔截器中的UserService空指針異常
分析:由於添加攔截器時,直接對UserLoginHandlerInterceptor進行new操作,導致UserService無法注入,所以有空指針異常。
解決:
- 發佈到獨立的tomcat中運行
在開發階段我們推薦使用內嵌的tomcat進行開發,因爲這樣會方便很多,但是到生成環境,我希望在獨立的tomcat容器中運行,因爲我們需要對tomcat做額外的優化,這時我們需要將工程打包成war包發進行發佈。
7.1. 工程的打包方式爲war
7.2. 將spring-boot-starter-tomcat的範圍設置爲provided
設置爲provided是在打包時會將該包排除,因爲要放到獨立的tomcat中運行,是不需要的。
打包成功:
7.5. 部署到tomcat
解壓apache-tomcat-7.0.57.tar.gz,將war包解壓到webapps下的ROOT目錄中,啓動: