1,spring如何解决循环依赖
用到三级缓存,具体过程如下:
(1)初始化bean之前,将这个beanname放入三级缓存
(2)将准备创建的bean放入sigletonscurrentlyCreation
(3)创建新实例后调用addsigletonFactory方法,将这个实例化但未属性赋值的bean放入二级缓存,从三级缓存中移除
(4)属性赋值和自动注入时,引发关联创建
(5)关联创建时,检查正在被创建的bean中是否有即将注入的bean,如果有检查二级缓存里面有没有创建好但没属性赋值的bean,若没有,检查三级缓存有没有正在创建中的bean,此时一般有,将此bean放入二级缓存,从三级缓存里移除
(6)之后bean被成功注入,最后执行addsigleton,将这个完全创建好的bean放入一级缓存,从二级,三级缓存中移除,并记录已经创建的单例bean
2,spring中bean的作用域有哪些?
sigleton:唯一bean实例,spring中的bean默认都是单例的
prototype:每次请求都会创建一个新的bean实例
request:每次http请求都会创建一个新的bean实例,该bean实例仅仅在该http request内有效
session:每次http请求都会创建一个新的bean实例,该bean实例仅仅在该http session内有效
3,什么是IOC?
控制反转是一种设计思想,原本用户在程序中手动创建对象的控制权,交给spring容器管理。IOC容器是spring实现IOC思想的载体,本质上是一个Map,Map的映射是beanName->对象
将对象之间相互依赖关系交给IOC容器管理,并由IOC容器负责注入,可以大大简化应用开发。IOC容器像工厂一样,当我们需要创建对象时,配置好配置文件/注解即可,完全不用考虑对象是如何创建出来的,只需在需要的地方引用即可。
4,什么是AOP
面向切面变成能将那些与业务无关,却为业务模块所共同调用的逻辑代码(事务处理,日志管理,权限控制)封装起来,减少系统冗余代码,降低模块间耦合度。
5,springAOP与AspectJ有什么区别?
(1)springAOP属于是运行时增强,AspectJ属于是编译时增强
(2)SpringAOP基于代理,AspectJ基于字节码操作
(3)SpringAOP较为简单,AspectJ更为强大
(4)切面太多时,选择AspectJ,它比SpringAOP快很多
6,@Component和@Bean注解的区别?
(1)@component作用于类,而@Bean用于方法
(2)@component是利用路径扫描来自动侦测到以及自动装配到spring容器中,@Bean注解通常是在有该注解的方法中定义产生bean
(3)@Bean注解比@Component注解自定义性更强(第三方类库只能用@bean来注册bean)
7,@AutoWired注解和@Resource注解的区别
(1)@AutoWired是spring定义的注解,@Resource是java定义注解
(2)依赖查找顺序不同:@AutoWired是先byType再byName查找,@Resource是先byname再bytype查找
(3)@AutoWired只支持一个required参数,@Resource支持多个参数
(4)@AutoWired支持属性注入。构造注入和setter注入,而@Resource只支持属性注入和setter注入
(5)IDEA中,如果注入Mapper对象时,@AutoWired会报错而@Resource不会
8,@Repository和@Mapper的区别?
(1)@Repository是spring的注解,用于声明一个bean,单独使用没用,必须用@MapperScannerConfigurer配置扫描地址这个接口才会被扫描
(2)@Mapper是Mybatis的注解,用于mybatis找到对应的mapper,不需要配置扫描地址,可以单独使用,如果有多个mapper文件的话可以在项目启动类下使用@MapperScan配置mapper包扫描
9,spring中涉及的设计模式有哪些?
(1)工厂模式:使用beanfactory和applicationContext创建对象
(2)代理模式:SpringAOP的实现
(3)单例模式:Spring中的bean都是单例的
(4)模板模式:jdbcTemplate各种以Template结尾的对数据库操作的类
(5)装饰器模式:需连接多个数据库,动态切换不同数据源
(6)观察者模式:spring中的事务驱动模型
(7)适配器模式:SpringAOP中的增强或通知,SpringMVC中的用适配器匹配Controller