SpringBoot简介

在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot来让你更易上手,更简单快捷地构建Spring应用!
Spring Boot让我们的Spring应用变的更轻量化。比如:你可以仅仅依靠一个Java类来运行一个Spring引用。你也可以打包你的应用为jar并通过使用java -jar来运行你的Spring Web应用。
Spring Boot的主要优点:
为所有Spring开发者更快的入门
开箱即用,提供各种默认配置来简化项目配置
内嵌式容器简化Web项目
没有冗余代码生成和XML配置的要求
本章主要目标完成Spring Boot基础项目的构建,并且实现一个简单的Http请求处理,通过这个例子对Spring Boot有一个初步的了解,并体验其结构简单、开发快速的特性。

SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。
SpringMVC是控制层。

SpringBoot和SpringMVC区别:
SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。
SpringMVC是控制层。

SpringBoot和SpringCloud区别:
SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。
SpringMVC是控制层。
SpringCloud依赖与SpringBoot组件,使用SpringMVC编写Http协议接口,同时SpringCloud是一套完整的微服务解决框架。

spring-boot-starter-parent作用
在pom.xml中引入spring-boot-start-parent,spring官方的解释叫什么stater poms,它可以提供dependency management,也就是说依赖管理,引入以后在申明其它dependency的时候就不需要version了,后面可以看到。

_
spring-boot-starter-web**作用
springweb 核心组件
**
spring-boot-maven-plugin**作用**_
如果我们要直接Main启动spring,那么以下plugin必须要添加,否则是无法启动的。如果使用maven 的spring-boot:run的话是不需要此配置的。(我在测试的时候,如果不配置下面的plugin也是直接在Main中运行的。)

相关注解:
@RestController
在上加上RestController 表示修饰该Controller所有的方法返回JSON格式,直接可以编写
Restful接口


@EnableAutoConfiguration
注解:作用在于让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置
这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring。由于spring-boot-starter-web添加了Tomcat和Spring MVC,所以auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。

SpringApplication.run(HelloController.class, args);

标识为启动类

springboot整合使用JdbcTemplate

1.引入pom文件

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.5.2.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-jdbc</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>mysql</groupId>
  13. <artifactId>mysql-connector-java</artifactId>
  14. <version>5.1.21</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-test</artifactId>
  19. <scope>test</scope>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. </dependencies>

2.application.properties新增配置

  1. spring.datasource.url=jdbc:mysql://localhost:3306/test
  2. spring.datasource.username=root
  3. spring.datasource.password=root
  4. spring.datasource.driver-class-name=com.mysql.jdbc.Driver

UserService类

  1. @Service
  2. public class UserServiceImpl implements UserService {
  3. @Autowired
  4. private JdbcTemplate jdbcTemplate;
  5. public void createUser(String name, Integer age) {
  6. System.out.println("ssss");
  7. jdbcTemplate.update("insert into users values(null,?,?);", name, age);
  8. }
  9. }

App类

  1. @ComponentScan(basePackages = "com.itmayiedu")
  2. @EnableAutoConfiguration
  3. public class App {
  4. public static void main(String[] args) {
  5. SpringApplication.run(App.class, args);
  6. }
  7. }

springboot整合使用mybatis

1.pom文件引入

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.3.2.RELEASE</version>
  5. <relativePath /> <!-- lookup parent from repository -->
  6. </parent>
  7. <dependencies>
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter</artifactId>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-test</artifactId>
  15. <scope>test</scope>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.mybatis.spring.boot</groupId>
  19. <artifactId>mybatis-spring-boot-starter</artifactId>
  20. <version>1.1.1</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>mysql</groupId>
  24. <artifactId>mysql-connector-java</artifactId>
  25. <version>5.1.21</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-web</artifactId>
  30. </dependency>
  31. </dependencies>

2.配置文件引入

  1. spring.datasource.url=jdbc:mysql://localhost:3306/test
  2. spring.datasource.username=root
  3. spring.datasource.password=root
  4. spring.datasource.driver-class-name=com.mysql.jdbc.Driver

3.Mapper代码

  1. public interface UserMapper {
  2. @Select("SELECT * FROM USERS WHERE NAME = #{name}")
  3. User findByName(@Param("name") String name);
  4. @Insert("INSERT INTO USERS(NAME, AGE) VALUES(#{name}, #{age})")
  5. int insert(@Param("name") String name, @Param("age") Integer age);
  6. }

启动方式:

  1. @ComponentScan(basePackages = "com.itmayiedu")
  2. @MapperScan(basePackages = "com.itmayiedu.mapper")
  3. @SpringBootApplication
  4. public class App {
  5. public static void main(String[] args) {
  6. SpringApplication.run(App.class, args);
  7. }
  8. }

springboot整合使用springjpa

1.pom文件引入依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.4.2.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-data-jpa</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>mysql</groupId>
  13. <artifactId>mysql-connector-java</artifactId>
  14. <version>5.1.21</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-web</artifactId>
  19. </dependency>
  20. </dependencies>

2.创建User实体类

  1. @Entity(name = "users")
  2. public class User {
  3. @Id
  4. @GeneratedValue
  5. private Integer id;
  6. @Column
  7. private String name;
  8. @Column
  9. private Integer age;
  10. // ..get/set方法
  11. }

3.创建UserDao

  1. public interface UserDao extends JpaRepository<User, Integer> {
  2. }

4.创建IndexController

  1. @RestController
  2. public class IndexController {
  3. @Autowired
  4. private UserDao userDao;
  5. @RequestMapping("/index")
  6. public String index(Integer id) {
  7. User findUser = userDao.findOne(id);
  8. System.out.println(findUser.getName());
  9. return "success";
  10. }
  11. }

5.启动项目

  1. @ComponentScan(basePackages = { "com.itmayiedu" })
  2. @EnableJpaRepositories(basePackages = "com.itmayiedu.dao")
  3. @EnableAutoConfiguration
  4. @EntityScan(basePackages = "com.itmayiedu.entity")
  5. public class App {
  6. public static void main(String[] args) {
  7. SpringApplication.run(App.class, args);
  8. }
  9. }

springboot整合多数据源

。。。

Springboot整合事物管理

springboot默认集成事物,只主要在方法上加上@Transactional即可

SpringBoot分布式事物管理

使用springboot+jta+atomikos 分布式事物管理

1新增pom包

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-jta-atomikos</artifactId>
  4. </dependency>

2.新增配置文件信息

  1. # Mysql 1
  2. mysql.datasource.test.url = jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
  3. mysql.datasource.test.username = root
  4. mysql.datasource.test.password = root
  5. mysql.datasource.test.minPoolSize = 3
  6. mysql.datasource.test.maxPoolSize = 25
  7. mysql.datasource.test.maxLifetime = 20000
  8. mysql.datasource.test.borrowConnectionTimeout = 30
  9. mysql.datasource.test.loginTimeout = 30
  10. mysql.datasource.test.maintenanceInterval = 60
  11. mysql.datasource.test.maxIdleTime = 60
  12. mysql.datasource.test.testQuery = select 1
  13. # Mysql 2
  14. mysql.datasource.test2.url =jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
  15. mysql.datasource.test2.username =root
  16. mysql.datasource.test2.password =root
  17. mysql.datasource.test2.minPoolSize = 3
  18. mysql.datasource.test2.maxPoolSize = 25
  19. mysql.datasource.test2.maxLifetime = 20000
  20. mysql.datasource.test2.borrowConnectionTimeout = 30
  21. mysql.datasource.test2.loginTimeout = 30
  22. mysql.datasource.test2.maintenanceInterval = 60
  23. mysql.datasource.test2.maxIdleTime = 60
  24. mysql.datasource.test2.testQuery = select 1

3.读取配置文件信息

  1. package com.itmayiedu.config;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. @ConfigurationProperties(prefix = "mysql.datasource.test")
  4. public class DBConfig1 {
  5. private String url;
  6. private String username;
  7. private String password;
  8. private int minPoolSize;
  9. private int maxPoolSize;
  10. private int maxLifetime;
  11. private int borrowConnectionTimeout;
  12. private int loginTimeout;
  13. private int maintenanceInterval;
  14. private int maxIdleTime;
  15. private String testQuery;
  16. }
  17. package com.itmayiedu.config;
  18. import org.springframework.boot.context.properties.ConfigurationProperties;
  19. @ConfigurationProperties(prefix = "mysql.datasource.test1")
  20. public class DBConfig2 {
  21. private String url;
  22. private String username;
  23. private String password;
  24. private int minPoolSize;
  25. private int maxPoolSize;
  26. private int maxLifetime;
  27. private int borrowConnectionTimeout;
  28. private int loginTimeout;
  29. private int maintenanceInterval;
  30. private int maxIdleTime;
  31. private String testQuery;
  32. }

4.创建多数据源

  1. @Configuration
  2. // basePackages 最好分开配置 如果放在同一个文件夹可能会报错
  3. @MapperScan(basePackages = "com.itmayiedu.test1", sqlSessionTemplateRef = "testSqlSessionTemplate")
  4. public class TestMyBatisConfig1 {
  5. // 配置数据源
  6. @Primary
  7. @Bean(name = "testDataSource")
  8. public DataSource testDataSource(DBConfig1 testConfig) throws SQLException {
  9. MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
  10. mysqlXaDataSource.setUrl(testConfig.getUrl());
  11. mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
  12. mysqlXaDataSource.setPassword(testConfig.getPassword());
  13. mysqlXaDataSource.setUser(testConfig.getUsername());
  14. mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
  15. AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
  16. xaDataSource.setXaDataSource(mysqlXaDataSource);
  17. xaDataSource.setUniqueResourceName("testDataSource");
  18. xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());
  19. xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());
  20. xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());
  21. xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());
  22. xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());
  23. xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());
  24. xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());
  25. xaDataSource.setTestQuery(testConfig.getTestQuery());
  26. return xaDataSource;
  27. }
  28. @Primary
  29. @Bean(name = "testSqlSessionFactory")
  30. public SqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource") DataSource dataSource)
  31. throws Exception {
  32. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  33. bean.setDataSource(dataSource);
  34. return bean.getObject();
  35. }
  36. @Primary
  37. @Bean(name = "testSqlSessionTemplate")
  38. public SqlSessionTemplate testSqlSessionTemplate(
  39. @Qualifier("testSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
  40. return new SqlSessionTemplate(sqlSessionFactory);
  41. }
  42. }
  43. // basePackages 最好分开配置 如果放在同一个文件夹可能会报错
  44. @Configuration
  45. @MapperScan(basePackages = "com.itmayiedu.test2", sqlSessionTemplateRef = "test2SqlSessionTemplate")
  46. public class TestMyBatisConfig2 {
  47. // 配置数据源
  48. @Bean(name = "test2DataSource")
  49. public DataSource testDataSource(DBConfig1 testConfig) throws SQLException {
  50. MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
  51. mysqlXaDataSource.setUrl(testConfig.getUrl());
  52. mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
  53. mysqlXaDataSource.setPassword(testConfig.getPassword());
  54. mysqlXaDataSource.setUser(testConfig.getUsername());
  55. mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
  56. AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
  57. xaDataSource.setXaDataSource(mysqlXaDataSource);
  58. xaDataSource.setUniqueResourceName("test2DataSource");
  59. xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());
  60. xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());
  61. xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());
  62. xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());
  63. xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());
  64. xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());
  65. xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());
  66. xaDataSource.setTestQuery(testConfig.getTestQuery());
  67. return xaDataSource;
  68. }
  69. @Bean(name = "test2SqlSessionFactory")
  70. public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource)
  71. throws Exception {
  72. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  73. bean.setDataSource(dataSource);
  74. return bean.getObject();
  75. }
  76. @Bean(name = "test2SqlSessionTemplate")
  77. public SqlSessionTemplate testSqlSessionTemplate(
  78. @Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
  79. return new SqlSessionTemplate(sqlSessionFactory);
  80. }
  81. }

5.启动加载配置

  1. @EnableConfigurationProperties(value = { DBConfig1.class, DBConfig2.class })

日志管理

使用log4j记录日志

新建log4j配置文件

文件名称log4j.properties

  1. #log4j.rootLogger=CONSOLE,info,error,DEBUG
  2. log4j.rootLogger=info,error,CONSOLE,DEBUG
  3. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
  4. log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
  5. log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
  6. log4j.logger.info=info
  7. log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
  8. log4j.appender.info.layout=org.apache.log4j.PatternLayout
  9. log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
  10. log4j.appender.info.datePattern='.'yyyy-MM-dd
  11. log4j.appender.info.Threshold = info
  12. log4j.appender.info.append=true
  13. #log4j.appender.info.File=/home/admin/pms-api-services/logs/info/api_services_info
  14. log4j.appender.info.File=/Users/dddd/Documents/testspace/pms-api-services/logs/info/api_services_info
  15. log4j.logger.error=error
  16. log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
  17. log4j.appender.error.layout=org.apache.log4j.PatternLayout
  18. log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
  19. log4j.appender.error.datePattern='.'yyyy-MM-dd
  20. log4j.appender.error.Threshold = error
  21. log4j.appender.error.append=true
  22. #log4j.appender.error.File=/home/admin/pms-api-services/logs/error/api_services_error
  23. log4j.appender.error.File=/Users/dddd/Documents/testspace/pms-api-services/logs/error/api_services_error
  24. log4j.logger.DEBUG=DEBUG
  25. log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
  26. log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout
  27. log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
  28. log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd
  29. log4j.appender.DEBUG.Threshold = DEBUG
  30. log4j.appender.DEBUG.append=true
  31. #log4j.appender.DEBUG.File=/home/admin/pms-api-services/logs/debug/api_services_debug
  32. log4j.appender.DEBUG.File=/Users/dddd/Documents/testspace/pms-api-services/logs/debug/api_services_debug
  1. log4j代码
  2. private static final Logger logger = LoggerFactory.getLogger(IndexController.class);

Maven依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.0.0.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <!-- SpringBoot 核心组件 -->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-web</artifactId>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-tomcat</artifactId>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.apache.tomcat.embed</groupId>
  18. <artifactId>tomcat-embed-jasper</artifactId>
  19. </dependency>
  20. <!-- spring boot start -->
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter</artifactId>
  24. <exclusions>
  25. <!-- 排除自带的logback依赖 -->
  26. <exclusion>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-logging</artifactId>
  29. </exclusion>
  30. </exclusions>
  31. </dependency>
  32. <!-- springboot-log4j -->
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-log4j</artifactId>
  36. <version>1.3.8.RELEASE</version>
  37. </dependency>
  38. </dependencies>

使用AOP统一处理Web请求日志

1.POM文件新增依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-aop</artifactId>
  4. </dependency>

相关代码

  1. @Aspect
  2. @Component
  3. public class WebLogAspect {
  4. private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
  5. @Pointcut("execution(public * com.itmayiedu.controller.*.*(..))")
  6. public void webLog() {
  7. }
  8. @Before("webLog()")
  9. public void doBefore(JoinPoint joinPoint) throws Throwable {
  10. // 接收到请求,记录请求内容
  11. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  12. HttpServletRequest request = attributes.getRequest();
  13. // 记录下请求内容
  14. logger.info("URL : " + request.getRequestURL().toString());
  15. logger.info("HTTP_METHOD : " + request.getMethod());
  16. logger.info("IP : " + request.getRemoteAddr());
  17. Enumeration<String> enu = request.getParameterNames();
  18. while (enu.hasMoreElements()) {
  19. String name = (String) enu.nextElement();
  20. logger.info("name:{},value:{}", name, request.getParameter(name));
  21. }
  22. }
  23. @AfterReturning(returning = "ret", pointcut = "webLog()")
  24. public void doAfterReturning(Object ret) throws Throwable {
  25. // 处理完请求,返回内容
  26. logger.info("RESPONSE : " + ret);
  27. }
  28. }

Spring Boot集成lombok让代码更简洁

添加lombok依赖

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. </dependency>

实体类演示

  1. @Slf4j
  2. @Data
  3. public class UserEntity {
  4. // @Getter
  5. // @Setter
  6. private String userName;
  7. // @Getter
  8. // @Setter
  9. private Integer age;
  10. @Override
  11. public String toString() {
  12. return "UserEntity [userName=" + userName + ", age=" + age + "]";
  13. }
  14. public static void main(String[] args) {
  15. UserEntity userEntity = new UserEntity();
  16. userEntity.setUserName("zhangsan");
  17. userEntity.setAge(20);
  18. System.out.println(userEntity.toString());
  19. log.info("####我是日志##########");
  20. }
  21. }

其他特性

  1. @Data 标签,生成getter/setter toString()等方法
  2. @NonNull : 让你不在担忧并且爱上NullPointerException
  3. @CleanUp : 自动资源管理:不用再在finally中添加资源的close方法
  4. @Setter/@Getter : 自动生成setget方法
  5. @ToString : 自动生成toString方法
  6. @EqualsAndHashcode : 从对象的字段中生成hashCodeequals的实现
  7. @NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor
  8. 自动生成构造方法
  9. @Data : 自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法
  10. @Value : 用于注解final
  11. @Builder : 产生复杂的构建器api
  12. @SneakyThrows : 异常处理(谨慎使用)
  13. @Synchronized : 同步方法安全的转化
  14. @Getter(lazy=true) :
  15. @Log : 支持各种logger对象,使用时用对应的注解,如:@Log4

缓存支持

注解配置与EhCache使用
pom文件引入

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-cache</artifactId>
  4. </dependency>

新建ehcache.xml 文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
  4. updateCheck="false">
  5. <diskStore path="java.io.tmpdir/Tmp_EhCache" />
  6. <!-- 默认配置 -->
  7. <defaultCache maxElementsInMemory="5000" eternal="false"
  8. timeToIdleSeconds="120" timeToLiveSeconds="120"
  9. memoryStoreEvictionPolicy="LRU" overflowToDisk="false" />
  10. <cache name="baseCache" maxElementsInMemory="10000"
  11. maxElementsOnDisk="100000" />
  12. </ehcache>
  13. 配置信息介绍
  14. 1. <!--
  15. 2. name:缓存名称。
  16. 3. maxElementsInMemory:缓存最大个数。
  17. 4. eternal:对象是否永久有效,一但设置了,timeout将不起作用。
  18. 5. timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
  19. 6. timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
  20. 7. overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
  21. 8. diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
  22. 9. maxElementsOnDisk:硬盘最大缓存个数。
  23. 10. diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
  24. 11. diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
  25. 12. memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
  26. 13. clearOnFlush:内存数量最大时是否清除。
  27. 14. -->

代码使用Cacheable

  1. @CacheConfig(cacheNames = "baseCache")
  2. public interface UserMapper {
  3. @Select("select * from users where name=#{name}")
  4. @Cacheable
  5. UserEntity findName(@Param("name") String name);
  6. }

清除缓存

  1. @Autowired
  2. private CacheManager cacheManager;
  3. @RequestMapping("/remoKey")
  4. public void remoKey() {
  5. cacheManager.getCache("baseCache").clear();
  6. }

启动加入缓存
@EnableCaching // 开启缓存注解

使用@Scheduled创建定时任务

在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置

  1. @Component
  2. public class ScheduledTasks {
  3. private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
  4. @Scheduled(fixedRate = 5000)
  5. public void reportCurrentTime() {
  6. System.out.println("现在时间:" + dateFormat.format(new Date()));
  7. }
  8. }

使用@Async实现异步调用

启动加上@EnableAsync ,需要执行异步方法上加入 @Async
在方法上加上@Async之后 底层使用多线程技术
_


_

Maven依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.0.0.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.projectlombok</groupId>
  13. <artifactId>lombok</artifactId>
  14. </dependency>
  15. </dependencies>

演示代码:

  1. @RestController
  2. @Slf4j
  3. public class IndexController {
  4. @Autowired
  5. private UserService userService;
  6. @RequestMapping("/index")
  7. public String index() {
  8. log.info("##01##");
  9. userService.userThread();
  10. log.info("##04##");
  11. return "success";
  12. }
  13. }
  14. @Service
  15. @Slf4j
  16. public class UserService {
  17. @Async // 类似与开启线程执行..
  18. public void userThread() {
  19. log.info("##02##");
  20. try {
  21. Thread.sleep(5 * 1000);
  22. } catch (Exception e) {
  23. // TODO: handle exception
  24. }
  25. log.info("##03##");
  26. // new Thread(new Runnable() {
  27. // public void run() {
  28. // log.info("##02##");
  29. // try {
  30. // Thread.sleep(5 * 1000);
  31. // } catch (Exception e) {
  32. // // TODO: handle exception
  33. // }
  34. // log.info("##03##");
  35. // }
  36. // }).start();
  37. }
  38. }
  39. @EnableAsync // 开启异步注解
  40. @SpringBootApplication
  41. public class App {
  42. public static void main(String[] args) {
  43. SpringApplication.run(App.class, args);
  44. }
  45. }

自定义参数

配置文件值
name=itmayiedu.com
配置文件值

  1. @Value("${name}")
  2. private String name;
  3. @ResponseBody
  4. @RequestMapping("/getValue")
  5. public String getValue() {
  6. return name;
  7. }


多环境配置

spring.profiles.active=pre

  1. application-dev.properties:开发环境
  2. application-test.properties:测试环境
  3. application-prod.properties:生产环境

热部署

所谓的热部署:比如项目的热部署,就是在应用程序在不停止的情况下,实现新的部署

项目演示案例:

  1. @RestController
  2. @Slf4j
  3. public class IndexController {
  4. @Value("${itmayiedu}")
  5. private String itmayieduName;
  6. @RequestMapping("/index")
  7. public String index() {
  8. String result = "springboot2.0 V1.0";
  9. log.info("result:{}", result);
  10. return result + itmayieduName;
  11. }
  12. }

热部署原理:
spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间。
其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为 restart ClassLoader
_

,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间(5秒以内)

Devtools依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-devtools</artifactId>
  4. <optional>true</optional>
  5. <scope>true</scope>
  6. </dependency>

Devtools原理:

  1. devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),注意:因为其采用的虚拟机机制,该项重启是很快的。
  2. devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现(这里注意不同的模板配置不一样)

监控管理

Actuator监控应用

Actuator是spring boot的一个附加功能,可帮助你在应用程序生产环境时监视和管理应用程序。可以使用HTTP的各种请求来监管,审计,收集应用的运行情况.特别对于微服务管理十分有意义.缺点:没有可视化界面。

Maven依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.0.0.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-actuator</artifactId>
  14. </dependency>
  15. </dependencies>

YML配置

  1. ###通过下面的配置启用所有的监控端点,默认情况下,这些端点是禁用的;
  2. management:
  3. endpoints:
  4. web:
  5. exposure:
  6. include: "*"
  7. spring:
  8. profiles:
  9. active: prod
  10. datasource:
  11. driver-class-name: com.mysql.jdbc.Driver
  12. url: jdbc:mysql://127.0.0.1:3306/test
  13. username: root
  14. password: root
  15. itmayiedu:
  16. name: yushengjun

Actuator访问路径
通过actuator/+端点名就可以获取相应的信息。

路径 作用
/actuator/beans 显示应用程序中所有Spring bean的完整列表。
/actuator/configprops 显示所有配置信息。
/actuator/env 陈列所有的环境变量。
/actuator/mappings 显示所有@RequestMapping的url整理列表。
/actuator/health 显示应用程序运行状况信息 up表示成功 down失败
/actuator/info 查看应用信息

演示案例:
/actuator/info 配置文件新增

  1. info:
  2. itmayiedu: yushengjun
  3. addres: www.itmayiedu.com

Admin-UI分布式微服务监控中心

Admin-UI基于actuator实现能够返回界面展示监控信息


Admin-UI-Server
Maven依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.0.0.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <dependency>
  8. <groupId>de.codecentric</groupId>
  9. <artifactId>spring-boot-admin-starter-server</artifactId>
  10. <version>2.0.0</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-webflux</artifactId>
  15. </dependency>
  16. <!-- Spring Boot Actuator对外暴露应用的监控信息,Jolokia提供使用HTTP接口获取JSON格式 的数据 -->
  17. <dependency>
  18. <groupId>org.jolokia</groupId>
  19. <artifactId>jolokia-core</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-actuator</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>com.googlecode.json-simple</groupId>
  27. <artifactId>json-simple</artifactId>
  28. <version>1.1</version>
  29. </dependency>
  30. </dependencies>

application.yml配置文件

  1. spring:
  2. application:
  3. name: spring-boot-admin-server

启动方式

  1. @Configuration
  2. @EnableAutoConfiguration
  3. @EnableAdminServer
  4. public class AdminServerApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(AdminServerApplication.class, args);
  7. }
  8. }

Admin-UI-Client
Maven依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.0.0.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <dependency>
  8. <groupId>de.codecentric</groupId>
  9. <artifactId>spring-boot-admin-starter-client</artifactId>
  10. <version>2.0.0</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-actuator</artifactId>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.jolokia</groupId>
  18. <artifactId>jolokia-core</artifactId>
  19. </dependency>
  20. <dependency>
  21. <groupId>com.googlecode.json-simple</groupId>
  22. <artifactId>json-simple</artifactId>
  23. <version>1.1</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-web</artifactId>
  28. </dependency>
  29. </dependencies>

YML配置

  1. spring:
  2. boot:
  3. admin:
  4. client:
  5. url: http://localhost:8080
  6. server:
  7. port: 8081
  8. management:
  9. endpoints:
  10. web:
  11. exposure:
  12. include: "*"
  13. endpoint:
  14. health:
  15. show-details: ALWAYS

启动类

  1. @SpringBootApplication
  2. public class AppClinet {
  3. public static void main(String[] args) {
  4. SpringApplication.run(AppClinet.class, args);
  5. }
  6. }

image.png

性能优化

组件自动扫描带来的问题

默认情况下,我们会使用 @SpringBootApplication 注解来自动获取应用的配置信息,但这样也会给应用带来一些副作用。使用这个注解后,会触发自动配置( auto-configuration )和 组件扫描 ( component scanning ),这跟使用 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解的作用是一样的。这样做给开发带来方便的同时,也会有三方面的影响:
1、会导致项目启动时间变长。当启动一个大的应用程序,或将做大量的集成测试启动应用程序时,影响会特别明显。
2、会加载一些不需要的多余的实例(beans)。
3、会增加 CPU 消耗。
针对以上三个情况,我们可以移除 @SpringBootApplication 和 @ComponentScan 两个注解来禁用组件自动扫描,然后在我们需要的 bean 上进行显式配置:

  1. //// 移除 @SpringBootApplication and @ComponentScan, 用 @EnableAutoConfiguration 来替代
  2. //@SpringBootApplication
  3. @Configuration
  4. @EnableAutoConfiguration
  5. public class App01 {
  6. public static void main(String[] args) {
  7. SpringApplication.run(App01.class, args);
  8. }
  9. }

以@SpringBootApplication 启动时间8.56秒

将Servlet容器变成Undertow

默认情况下,Spring Boot 使用 Tomcat 来作为内嵌的 Servlet 容器
可以将 Web 服务器切换到 Undertow 来提高应用性能。Undertow 是一个采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。Undertow 是红帽公司的开源产品,是 Wildfly 默认的 Web 服务器。首先,从依赖信息里移除 Tomcat 配置:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-tomcat</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11. 然后添加 Undertow
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-undertow</artifactId>
  15. </dependency>

SpringBoot JVM参数调优

这个根据服务器的内存大小,来设置堆参数。
-Xms :设置Java堆栈的初始化大小
-Xmx :设置最大的java堆大小
实例参数-XX:+PrintGCDetails -Xmx32M -Xms1M
本地项目调优
image.png
外部运行调优
java -server -Xms32m -Xmx32m -jar springboot_v2.jar

服务器名称 第一次运行 第二次运行 第三次运行 平均值
Tomcat 4773 5194 5334.7 5100
Undertow 6666 6373 6451 6496

2.0版本新特性

以Java 8 为基准
Spring Boot 2.0 要求Java 版本必须8以上, Java 6 和 7 不再支持。

内嵌容器包结构调整:
为了支持reactive使用场景,内嵌的容器包结构被重构了的幅度有点大。EmbeddedServletContainer被重命名为WebServer,并且org.springframework.boot.context.embedded 包被重定向到了org.springframework.boot.web.embedded包下。举个例子,如果你要使用TomcatEmbeddedServletContainerFactory回调接口来自定义内嵌Tomcat容器,你现在应该使用TomcatServletWebServerFactory。


Servlet-specific 的server properties调整
大量的Servlet专属的server.* properties被移到了server.servlet下:

Old property New property
server.context-parameters.* server.servlet.context-parameters.*
server.context-path server.servlet.context-path
server.jsp.class-name server.servlet.jsp.class-name
server.jsp.init-parameters.* server.servlet.jsp.init-parameters.*
server.jsp.registered server.servlet.jsp.registered
server.servlet-path server.servlet.path

由此可以看出一些端倪,那就是server不再是只有servlet了,还有其他的要加入。


Actuator 默认映射
ctuator的端点(endpoint)现在默认映射到/application,比如,/info 端点现在就是在/application/info。但你可以使用management.context-path来覆盖此默认值。


Spring Loaded不再支持
由于Spring Loaded项目已被移到了attic了,所以不再支持Spring Loaded了。现在建议你去使用Devtools。Spring Loaded不再支持了。


支持Quartz Scheduler

Spring Boot 2 针对Quartz调度器提供了支持。你可以加入spring-boot-starter-quartz starter来启用。而且支持基于内存和基于jdbc两种存储。

OAuth 2.0 支持

Spring Security OAuth 项目中的功能将会迁移到Spring Security中。将会OAuth 2.0。

支持Spring WebFlux

WebFlux 模块的名称是 spring-webflux,名称中的 Flux 来源于 Reactor 中的类 Flux。该模块中包含了对反应式 HTTP、服务器推送事件和 WebSocket 的客户端和服务器端的支持。对于开发人员来说,比较重要的是服务器端的开发,这也是本文的重点。在服务器端,WebFlux 支持两种不同的编程模型:第一种是 Spring MVC 中使用的基于 Java 注解的方式;第二种是基于 Java 8 的 lambda 表达式的函数式编程模型。这两种编程模型只是在代码编写方式上存在不同。它们运行在同样的反应式底层架构之上,因此在运行时是相同的。WebFlux 需要底层提供运行时的支持,WebFlux 可以运行在支持 Servlet 3.1 非阻塞 IO API 的 Servlet 容器上,或是其他异步运行时环境,如 Netty 和 Undertow。
_
版本要求:
Jetty
要求Jetty最低版本为9.4。

Tomcat
要求Tomcat最低版本为8.5。

Hibernate
要求Hibernate最低版本为5.2。

Gradle
要求Gradle最低版本为3.4。

SendGrid
SendGrid最低支持版本是3.2。为了支持这次升级,username和password已经被干掉了。因为API key现在是唯一支持的认证方式。

SpringBoot整合拦截器


创建拦截器
创建模拟登录拦截器,验证请求是否有token参数

  1. @Slf4j
  2. @Component
  3. public class LoginIntercept implements HandlerInterceptor {
  4. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  5. throws Exception {
  6. log.info("开始拦截登录请求....");
  7. String token = request.getParameter("token");
  8. if (StringUtils.isEmpty(token)) {
  9. response.getWriter().println("not found token");
  10. return false;
  11. }
  12. return true;
  13. }
  14. }

注册拦截器

  1. @Configuration
  2. public class WebAppConfig {
  3. @Autowired
  4. private LoginIntercept loginIntercept;
  5. @Bean
  6. public WebMvcConfigurer WebMvcConfigurer() {
  7. return new WebMvcConfigurer() {
  8. public void addInterceptors(InterceptorRegistry registry) {
  9. registry.addInterceptor(loginIntercept).addPathPatterns("/*");
  10. };
  11. };
  12. }
  13. }

拦截器与过滤器区别
拦截器是AOP( Aspect-Oriented Programming)的一种实现,底层通过动态代理模式完成。
(1)拦截器是基于java的反射机制的,而过滤器是基于函数回调。
(2)拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。
(3)拦截器只能对Controller请求起作用,而过滤器则可以对几乎所有的请求起作用。
(4)在Controller的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

过滤器应用场景:设置编码字符、过滤铭感字符
拦截器应用场景:拦截未登陆用户、审计日志()

发布打包

一.Jar类型打包方式
1.使用mvn celan package 打包
2.使用java –jar 包名

二.war类型打包方式
1.使用mvn celan package 打包
2.使用java –jar 包名


外部Tomcat运行
1.使用mvn celan package 打包
2.2.0将war包 放入到tomcat webapps下运行即可。

注意:springboot2.0内置tomcat8.5.25,建议使用外部Tomcat9.0版本运行即可,否则报错版本不兼容。

SpringBoot框架原理

SpringBoot核心原理
基于SpringMVC无配置文件(纯Java)完全注解化+内置tomcat-embed-core实现SpringBoot框架,Main函数启动。
SpringBoot核心快速整合第三方框架原理:Maven继承依赖关系
SpringBoot内嵌入tomcat-embed-core
SpringBoot采用SpringMVC注解版本实现无配置效果
注意:本节课说的不是SpringBoot流程还是SpringBoot核心原理

内置Tomcat容器
Java提供内置Tomcat容器框架,使用Java语言操作Tomcat容器。
案例: 使用Java语言创建一个Tomcat容器

Maven依赖

  1. <dependencies>
  2. <!--Java语言操作tomcat -->
  3. <dependency>
  4. <groupId>org.apache.tomcat.embed</groupId>
  5. <artifactId>tomcat-embed-core</artifactId>
  6. <version>8.5.16</version>
  7. </dependency>
  8. <!-- spring-web -->
  9. <dependency>
  10. <groupId>org.springframework</groupId>
  11. <artifactId>spring-web</artifactId>
  12. <version>5.0.4.RELEASE</version>
  13. <scope>compile</scope>
  14. </dependency>
  15. <!-- spring-mvc -->
  16. <dependency>
  17. <groupId>org.springframework</groupId>
  18. <artifactId>spring-webmvc</artifactId>
  19. <version>5.0.4.RELEASE</version>
  20. <scope>compile</scope>
  21. </dependency>
  22. <!-- tomcatjsp支持 -->
  23. <dependency>
  24. <groupId>org.apache.tomcat</groupId>
  25. <artifactId>tomcat-jasper</artifactId>
  26. <version>8.5.16</version>
  27. </dependency>
  28. </dependencies>

创建Servet类

  1. public class IndexServet extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. doPost(req, resp);
  5. }
  6. @Override
  7. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  8. resp.getWriter().print("springboot2.0");
  9. }
  10. }

创建Tomcat运行

  1. // 端口号
  2. private static int PORT = 8080;
  3. // 项目名称
  4. private static String CONTEXTPATH = "/itmayiedu";
  5. public static void main(String[] args) throws LifecycleException {
  6. // 创建Tomcat服务器
  7. Tomcat tomcatServer = new Tomcat();
  8. // 设置Tomcat端口号
  9. tomcatServer.setPort(PORT);
  10. tomcatServer.getHost().setAutoDeploy(false);
  11. // 创建Context上下文
  12. StandardContext standardContext = new StandardContext();
  13. standardContext.setPath(CONTEXTPATH);
  14. standardContext.addLifecycleListener(new FixContextListener());
  15. // tomcat容器添加standardContext
  16. tomcatServer.getHost().addChild(standardContext);
  17. // 创建servlet
  18. tomcatServer.addServlet(CONTEXTPATH, "IndexServet", new IndexServet());
  19. // 添加servleturl映射
  20. standardContext.addServletMappingDecoded("/index", "IndexServet");
  21. tomcatServer.start();
  22. System.out.println("tomcat启动...");
  23. tomcatServer.getServer().await();
  24. }

SpringMVC(无配置启动)
SpringMVC原理回顾
image.png

⑴ 用户发送请求至前端控制器DispatcherServlet
⑵ DispatcherServlet收到请求调用HandlerMapping处理器映射器。
⑶ 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
⑷ DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
⑸ 执行处理器(Controller,也叫后端控制器)。
⑹ Controller执行完成返回ModelAndView
⑺ HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
⑻ DispatcherServlet将ModelAndView传给ViewReslover视图解析器
⑼ ViewReslover解析后返回具体View
⑽ DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
⑾ DispatcherServlet响应用户。

SpringMVC注解启动方式
_DispatcherServlet是Spring MVC的核心,每当应用接受一个HTTP请求,由DispatcherServlet负责将请求分发给应用的其他组件。

在旧版本中,DispatcherServlet之类的servlet一般在web.xml文件中配置,该文件一般会打包进最后的war包种;但是Spring 3引入了注解,我们这节课讲解,如何基于注解配置Spring MVC。
_
Maven依赖

  1. <dependencies>
  2. <!--Java语言操作tomcat -->
  3. <dependency>
  4. <groupId>org.apache.tomcat.embed</groupId>
  5. <artifactId>tomcat-embed-core</artifactId>
  6. <version>8.5.16</version>
  7. </dependency>
  8. <!-- spring-web -->
  9. <dependency>
  10. <groupId>org.springframework</groupId>
  11. <artifactId>spring-web</artifactId>
  12. <version>5.0.4.RELEASE</version>
  13. <scope>compile</scope>
  14. </dependency>
  15. <!-- spring-mvc -->
  16. <dependency>
  17. <groupId>org.springframework</groupId>
  18. <artifactId>spring-webmvc</artifactId>
  19. <version>5.0.4.RELEASE</version>
  20. <scope>compile</scope>
  21. </dependency>
  22. <!-- tomcatjsp支持 -->
  23. <dependency>
  24. <groupId>org.apache.tomcat</groupId>
  25. <artifactId>tomcat-jasper</artifactId>
  26. <version>8.5.16</version>
  27. </dependency>
  28. </dependencies>

加载SpringMVCDispatcherServlet
**
AbstractAnnotationConfigDispatcherServletInitializer这个类负责配置DispatcherServlet、初始化Spring MVC容器和Spring容器。getRootConfigClasses()方法用于获取Spring应用容器的配置文件,这里我们给定预先定义的RootConfig.classgetServletConfigClasses负责获取Spring MVC应用容器,这里传入预先定义好的WebConfig.classgetServletMappings()方法负责指定需要由DispatcherServlet映射的路径,这里给定的是”/“,意思是由DispatcherServlet处理所有向该应用发起的请求。

  1. /**
  2. * 加载SpringMVCDispatcherServlet
  3. *
  4. * @作者说明 每特教育-余胜军 <br>
  5. * @联系方式 qq644064779|www.itmayieducom-蚂蚁课堂<br>
  6. */
  7. public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
  8. // 加载根容器
  9. protected Class<?>[] getRootConfigClasses() {
  10. // TODO Auto-generated method stub
  11. return new Class[] { RootConfig.class };
  12. }
  13. // 加载SpringMVC容器
  14. protected Class<?>[] getServletConfigClasses() {
  15. return new Class[] { WebConfig.class };
  16. }
  17. // SpringMVCDispatcherServlet 拦截的请求 /
  18. protected String[] getServletMappings() {
  19. return new String[] { "/" };
  20. }
  21. }

加载SpringMVC容器
**
正如可以通过多种方式配置DispatcherServlet一样,也可以通过多种方式启动Spring MVC特性。原来我们一般在xml文件中使用元素启动注解驱动的Spring MVC特性。

  1. /**
  2. * SpringMVC容器<br>
  3. *
  4. * @EnableWebMvc 开启SpringMVC功能<br>
  5. * @Configuration 配置<br>
  6. */
  7. @Configuration
  8. @EnableWebMvc
  9. @ComponentScan("com.itmayiedu.controller")
  10. public class WebConfig extends WebMvcConfigurerAdapter {
  11. }

RootConfig容器

  1. /**
  2. * 根容器 <br>
  3. */
  4. @Configuration
  5. @ComponentScan(basePackages = "com.itmayiedu")
  6. public class RootConfig {
  7. }

运行代码

  1. public static void main(String[] args) throws ServletException, LifecycleException {
  2. start();
  3. }
  4. public static void start() throws ServletException, LifecycleException {
  5. // 创建Tomcat容器
  6. Tomcat tomcatServer = new Tomcat();
  7. // 端口号设置
  8. tomcatServer.setPort(9090);
  9. // 读取项目路径
  10. StandardContext ctx = (StandardContext) tomcatServer.addWebapp("/", new File("src/main").getAbsolutePath());
  11. // 禁止重新载入
  12. ctx.setReloadable(false);
  13. // class文件读取地址
  14. File additionWebInfClasses = new File("target/classes");
  15. // 创建WebRoot
  16. WebResourceRoot resources = new StandardRoot(ctx);
  17. // tomcat内部读取Class执行
  18. resources.addPreResources(
  19. new DirResourceSet(resources, "/WEB-INF/classes", additionWebInfClasses.getAbsolutePath(), "/"));
  20. tomcatServer.start();
  21. // 异步等待请求执行
  22. tomcatServer.getServer().await();
  23. }