Spring-core_ioc

126 阅读3分钟

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注解,在注入点或者类上加。可以延迟某个注入,解决循环依赖的问题。

借鉴:xie.infoq.cn/article/226…