1.请说说SpringBoot的优缺点
优点:
1) 启动器依赖,提供starter简化maven配置
2) 自动装配功能,自动整合许多第三方框架技术
3) 内嵌Web服务器,启动部署方便
4) 无需繁琐XML配置,遵守约定大于配置思想
缺点:
1) 代码集成度较高,不容易弄清楚底层原理(学习成本高)研究源码比较吃力
2) 内嵌Tomcat也带来修改Tomcat参数配置的不便
2.请问SpringBoot核心注解有哪些?
@SpringBootApplication: SpringBoot启动类入口标记注解
@SpringAutoConfiguration: 开启自动装配
@AutoConfigurationPackage: 自动导入启动器依赖包
@ConditionalOnClass: 让@Configuration在有条件的情况下生效
@ComponentScan: 设置SpringBoot环境扫描包的路径
3.Spring Bean的生命周期?(必会)
1)调用Bean的构造函数(创建对象,底层反射创建对象)通过反射创建对象
2)给Bean的成员变量赋值(依赖注入)
3)执行一些Aware接口,这些接口是可选的,例如BeanNameWare BeanFactoryAware ApplicationContextAware
4)调用InitializingBean接口的afterPropertiesSet方法(可选)
5)调用Bean的init方法(前提是声明该方法)(可选)
@PostContruct注解声明init方法
6)调用Bean的destory方法(前提是声明该方法)(可选)(通常不会执行,IOC容器主动销毁 applicationContext.close() )
@PreDestory注解声明destory方法
4.请说说哪些情况会导致Spring事务失效?
1)注解@Transactional配置的方法非public权限修饰
2)注解@Transactional所在类非Spring容器管理的bean
3)注解@Transactional所在类中,注解修饰的方法被该类内部方法调用(建议说)
4)业务代码抛出异常类型非RuntimeException,事务失效.
5)业务代码中存在异常时,使用try…catch…语句块捕获,而catch语句没有throw new RuntimeException异常
6)注解@Transactional中Propagation属性值设置错误,即Propagation.NOT_SUPPORTED(很少见)
事务传播行为共7个,常用4个
@Transactional(propagation =Propagation.REQUIRED )
默认值,当前方法必须出来事务中.前面的业务方法有事务,共享前面的事务;如果前面没有事务,则开启新事务.
@Transactional(propagation =Propagation.REQUIRED_NEW )
不管前面方法有无事务,都独立创建新事务
@Transactional(propagation =Propagation.SUPPORTS)
前面业务方法有事务,共享前面事务,若无,则不开事务,通常在查询业务中.
@Transactional(propagation =Propagation.NOT_SUPPORTED)
不支持事务
7)mysql关系型数据库,且存储引擎是MyISAM而非InnoDb,则事务会不起作用(很少见)MyISAM不支持事务.
7.Spring如何实现异步调用?什么时候会导致异步调用失效?
有了解.在启动类上开启异步线程调用@EnableAsync,在需要异步调用的方法添加@Async
以下情况会导致@Async失效:
1) 该方法非public修饰,会失效
2) 该方法被当前类的其他方法调用,也会失效
3) 该方法所在类不被Spring管理
8.请说说Spring是如何解决循环依赖问题?(难题)
构造循环是解决不了了,这里我们解决的是属性注入循环依赖问题.
这就要从spring的bean加载顺序说起了,默认情况下,spring是按照文件完整路径递归查找的,按路径+文件名排序,排在前面的先加载。所以TestService1比TestService2先加载,而改了文件名称之后,TestService2比TestService6先加载。
Spring内部有三级缓存(三个Map结构)
1) singletonObjects 一级缓存,用于存放初始化好的bean(最终要被用户使用)
2) earlySingletonObjects二级缓存,存放原始的bean对象(尚未填充属性),避免Bean实例化完成但未初始.
3) singletonFactories三级缓存,存放bean工厂对象(ObjectFactory),用于生成AOP代理对象(@Transactional 或@Asyc).
用于从SpringIOC容器获取一个Bean的底层,会先从以及缓存获取Bean;一级缓存拿不到,从二级缓存获取;二级缓存获取不到,从三级缓存获取
9.SpringBoot的自动装配原理
1)在启动类启动时加载@SpringBootApplication注解
2)在@SpringApplication注解里面包含三个注解:@ComponentScan, @Configuration, @EnableAutoConfiguration
3) @Configuration表名启动类是一个配置类
4) @ComponentScan自动扫描启动类所在的目录及子目录在Spring组件,让其实例化
5) @EnableAutoConfiguration注解里面包含AutoConfigurationImportSelector配置类
6)在AutoConfigurationImportSelector配置类中会读取springboot自动配置包中的MATE-INF的spring.factoried文件
7)该spring.factories文件包含一两百个SpringBoot写好的自动配置类
8)这些自动配置并不是默认生效的,而是根据环境中导入starter启动器依赖及自动配置类上@ConditionalOnClass注解决定该配置类是否生效.
10)我们在项目中就可以随时使用@Autowired进行注入并使用
10.SpringBoot常用注解
| 注解: | 作用: |
|---|---|
| @SpringBootApplication (类注解) | 它封装了核心的@SpringBootConfiguration +@EnableAutoConfiguration +@ComponentScan这三个类,大大节省了程序员配置时间,这就是SpringBoot的核心设计思想. |
| @EnableScheduling(类注解) | 是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器 |
| @MapperScan (类注解) | 支持mybatis组件的一个注解,通过此注解指定mybatis接口类的路径,即可完成对mybatis接口的扫描 |
| @EnableAutoConfiguration | 帮助SpringBoot程序将所有符合条件的@Configuration配置都加载到当前SpringBoot,并创建对应配置类的Bean,并把该Bean实体交给IoC容器进行管理 |
| @RestController(类注解) | 是@Controller 和@ResponseBody的结合,一个类被加上@RestController注解,数据接口中就不再需要添加@ResponseBody,更加简洁。 |
| @RequestMapping | 需要明确请求的路径 |
| @GetMappping,@PostMapping, @PutMapping, @DeleteMapping | 结合@RequestMapping使用, 是Rest风格的, 指定更明确的子路径. |
| @PathVariable | 路径变量注解,用{}来定义url部分的变量名. |
| @Service (类注解) | 这个注解用来标记业务层的组件,我们会将业务逻辑处理的类都会加上这个注解交给spring容器。事务的切面也会配置在这一层。当让 这个注解不是一定要用。有个泛指组件的注解,当我们不能确定具体作用的时候 可以用泛指组件的注解托付给spring容器(切记:在Service实现类上一定要加上这个) |
| @Component(类注解) | 和spring的注解功能一样, 注入到IOC容器中. |
| @ControllerAdvice(类注解) | 和 @ExceptionHandler 配合完成统一异常拦截处理. |
| @Mapper (类注解) | 添加了@Mapper注解之后这个接口在编译时交给SpringBoot自动生成相应的代理对象; |
