Spring Boot的自动配置
快速构建我们的Spring Boot项目,项目展开如图所示:
其中红圈标注部分就是我们的应用启动类,打开它:
@SpringBootApplication
是SpringBoot项目的核心注解,主要目的就是开启自动配置。Spring Boot在进行SpringApplication对象实例化时会加载Maven Dependencies下spring-boot-autoconfigure-版本号.jar下的META-INF里面的spring.factories
文件,将该配置文件中的配置载入到spring容器,进行自动配置。
Spring Boot部分常用注解
@SpringBootApplication
@SpringBootApplication与同时使用@Configuration、@EnableAutoConfiguration、@ComponentScan对等,spring框架会从@ComponentScan所在类的包开始扫描,所以应用启动类已启动就会扫描所有包。@RestController
@RestController注解是等价于@Controller+@ResponseBody的结合,使用这个注解的类,里面的方法都以JSON格式输出。@Autowired、@Resource、@Inject
这三个都是做bean的注入时使用。
注意:@Resource并不是spring的注解,它需要导入javax.annotation.Resource包,只不过spring支持该注解的注入
三者区别:
注解 | 自动注入策略 | 补充 |
@Autowird | 默认byType | 要求依赖对象必须存在,如果允许null,就必须设置它的required属性为false。结合@qualifier(“名称”)一起使用的话,就是按byName装配了 |
@Resource | 默认byName | 有name和type两个重要属性,使用name就是byName自动注入策略 ,使用type就是byType自动注入策略 |
@Inject | byType | 没有required属性 |
@Bean
将标注的方法的返回值作为一个bean注册到spring的IOC容器,方法名默认成该bean定义的id@Component,@Service,@Controller,@Repository
放在类上,表示将这些类纳入spring容器进行管理@Configuration
@Configuration 注解本质上还是 @Component。
@Configuration 注解的 bean 都已经变成了增强的类。
@Configuration 中所有带 @Bean 注解的方法都会被CGLIB动态代理,调用该方法返回的都是同一个实例。@Param
在dao层声明参数@requestBody
接收参数时用来处理content-type不是默认application/x-www-form-urlcoded编码的内容,比如application/json或者是application/xml等,一般情况下来说常用其来处理application/json类型。
Spring Boot热部署-自动重启的原理
spring boot使用两个类加载器,实现不变的类和正在开发的类分离,不变的类如jar由base类加载器加载,正在开发的类由restart类加载器加载。应用重启时,restart类加载器被扔掉创建,而base类加载器不变。
Spring Boot事务
1.事务说明
有编程式事务管理和声明式事务管理两种方式。
-
编程式事务管理
:
编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。 -
声明式事务管理
:
建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
声明式事务管理不需要入侵代码,通过@Transactional注解就可以进行事务操作,快捷简单。推荐使用。
2.声明式事务的使用
1.声明式事务管理只对RuntimeException()异常或是其子类进行事务回滚;checked异常,即Exception,可try{}catch{}捕获,是不会回滚的。对于自定义异常和运行时异常,可以通过@Transactional注解的rollbackFor属性进行设定。
捕获异常后,需要同时进行回滚,我们可以手动回滚:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
2.事务常用的属性
参数 | 功能描述 |
rollbackFor | 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class}) |
rollbackForClassName | 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:指定单一异常类名称@Transactional(rollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”}) |
noRollbackFor | 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class}) |
noRollbackForClassName | 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”}) |
!