Spring官方对Spring Core的定义: IoC Container, Events, Resources, i18n, Validation, Data Binding, Type Conversion, SpEL, AOP.
其中最重要的是:ioc、aop
IOC
IOC(Inversion Of Control)控制反转,也叫DI(dependency injection)依赖注入。控制反转和依赖注入是IOC的两个方面,我认为有了控制反转,自然就有了依赖注入。比如,之前创建一个对象时,需要new出你需要的对象,你需要一个人,男人,女人。你就new 人,new 男人,new 女人。控制反转的思想,是利用接口和继承关系,先创建出人这个类,然后把人的性别创建为一个interface,男人、女人、其他人都可以实现人这个类,人的构造函数中,将性别这个属性创建出来,set进去。至于创建出的人到底是男人,还是女人,还是其他的东西,都由传入的对象决定,也就是由性别的实现类决定,这就是控制反转。控制权从前边new的东西,转移到的后边传入的参数决定。那么,顺其自然,依赖注入,说的就这这个过程,将人,和后边的性别创建了强依赖关系,人的创建,必须要依赖于注入性别的属性决定。
Spring中的IOC
Spring核心就是一个DI框架,那么这个框架解决了哪些问题呢?
1.声明需要创建的对象需要哪些依赖对象
2.注册创建这些依赖对象所需要的类
3.提供一种使用1和2两点思想创建对象的机制
其实这个过程,就是一棵依赖树递归遍历的过程。Spring围绕ApplicationContext接口,解决了以上三个问题。
那么,ApplicationContext这个接口,其实主要由两个东西构成,Configuration和Bean。Configuration提供Bean之间的依赖关系配置,Bean提供基本的对象。ApplicationContext拿到这些Bean根据Configuration的规则来组装。
Spring IOC的使用
分为两种用法。
下面两种方法都支持,基于构造函数、setter方法、字段字节注入。
一、基于注解
@Configuration、@Bean、@Component、@ComponentScan、@Autowired
使用AnnotationConfigApplicationContext
二、基于xml
标签:bean、beans、constructor-arg
属性:id、class、ref
使用ClassPathXmlApplicationContext
问题
这样处理是完美了吗?显然没有,这其中还有两个重要的问题:
1.依赖冲突如何解决?
如果同同时有两个以上的对象,符合注入条件,Spring就会报错,这时候,可以使用@Qualifier注解来指定你要使用的类的名称。也可以使用 @Primary来告诉ApplicationContext容器,默认加载哪个组件。
2.循环依赖如何解决?
A和B两个对象构建,构建A时,发现依赖B,Spring去寻找B,发现需要A,这时候发现A在创建中,Spring就发现出现了循环依赖的问题。可以使用@Lazy注解,在注入点或者类上加。可以延迟某个注入,解决循环依赖的问题。