1、IOC
1、自动化配置
- xml文件
注册bean
属性注入:setter,构造方法,p命名空间,外部注入
复杂属性:对象ref,数组array,list,map
依赖注入:ctx.getBean() - Java配置类
@Configuration
修饰类
@Bean
修饰类内方法,方法内返回new的对象,bean名称就是方法名
依赖注入:ctx.getBean() - 自动配置
用Component
,Controller
,Service
,Repository
修饰类
需要@ComponentScan
扫描指定包才能配置到
依赖注入:
@Autowired按类型查找,配合@Qualifier按名称;
@Resources按名称查找;
@Inject按类型,配合@Named按名称
2、条件注解
3、其他知识
- bean的作用域
- id和name的区别
- 混合配置:java配置类和xml配置可以混着用,用一个注解引入
- aware类:有的类需要得到spring容器信息,让他实现aware接口即可
4、进阶
怎么解决循环依赖注入——只解决了单例模式下的构造器初始化
A对象setter依赖B对象,B对象setter依赖A对象:A对象先初始化个半成品,B可以拿这个半成品初始化,B初始化完毕后,A拿着这个B也能初始化了
2、AOP
功能:提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合
术语:
通知类型:前置通知,后置通知,异常通知,返回通知,环绕通知
Spring中的AOP和AspectJ的关系
都是支持AOP编程的框架
Spring中的AOP:是spring支持的AOP,不够完备
AspectJ是什么:是一套AOP框架,是最成熟的AOP框架,也是一种aop标准
不同点:织入的方式不同
spring AOP是运行时织入,基于动态代理
aspectJ是编译时织入
springAOP原理:
基于动态代理
如Java JDK的动态代理(Proxy,底层通过反射实现)
CGLIB的动态代理(底层通过继承实现)
配置方式:
xml:配置切面,切点等等等,非常麻烦
AspectJ注解:JDK接口实现类正常写,写个切面类,里面定义切点和通知方法
cglib:写实现类,写个切面类,里面定义切点和通知方法