Spring中的IOC和DI,以及Bean管理(具体可见项目spring_iocDemo)
1.Spring中IOC底层的实现原理
传统方式的开发: UserService us = new UserService();
即在web层创建业务层的类,并且连接口也没有,直接创建的就是实现类。
显然这种方式不好:后面则提倡面向接口编程,此时就是需要实现类了。
UserService us = new UserServiceImpl();
但这种方式也不好,因为在web层直接创建了接口的实现类,这样的话web层就和业务层产生了耦合。
后面则采用 OCP原则(开闭原则),即:open-close原则,对程序扩展是open;对修改代码是close;尽量做到不修改程序的源码,实现对程序的扩展。
上面这种情况,如果需要修改实现类,这时候就需要修改程序的源码了,显然不好。后面又有了:
可以采用设计模式:工厂模式
class FactoryBean{
public static UserSevice getUs() {
return new UserServiceImpl();
}
… // 还有其他类则往下写
}
UserService us = FactoryBean.getUs();
现在虽然接口和实现类没有耦合关系了,但是接口和工厂类产生了耦合。
假如要切换底层实现类的话,则还是需要去修改工厂类的源码,因此还是不好。后面则出现了:Spring的IOC
即用 工厂 + 反射 + 配置文件 的方式来实现。
配置文件:
工厂类:
public FactoryBean{
public Object getBean(String id) {
… // 解析配置文件,通过id找到对应的class
// 反射,实现生成
}
}
2. IOC(Inverse Of Control):控制反转 以及 DI(Depengdency Injection):依赖注入 的概念
- IOC反转控制:就是将原本在程序中手动创建UserService对象的控制权,交由Spring框架管理。
- 简单说,就是创建UserService对象的控制权被反转到了Spring框架。
- DI依赖注入:依赖于IOC,就是在Spring创建这个对象的过程中,将这个对象所依赖的属性注入进去。
3.Spring的Bean管理----工厂类介绍
由图中我们可以看到,我们所使用的工厂类是ApplicationContext接口,使用的实现类是ClassPathXmlApplicationContext,如果spring的配置文件在我们的文件系统中,则使用它左边这个绿色的实现类。
4.SpringBean管理,XMl的方式(具体实现可见项目中demo2包)
三种实例化Bean的方式
1.使用类构造器实例化(默认无参数)
2.使用静态工厂方法实例化(简单工厂模式)
3.使用实例工厂方法实例化(工厂方法模式)
一般情况下,我们采用第一种方式;当构造非常复杂的对象时,则考虑第二种或者第三种配置方式。
Bean的作用域(具体可见项目中demo3包)
Bean的生命周期(具体可见项目中demo3包)
1.instantiate bean对象实例化
2.populate properties封装属性
3.如果Bean实现Bean NameAware执行 setBeanName
4.如果Bean实现Bean’FactoryAware或者ApplicationContextAware设置工厂setBeanFactory或者上下文对象setApplicationContext
5.如果有自定义类实现了BeanPostProcessor接口(后处理Bean),执行postProcessBeforeInitialization
6.如果Bean实现InitializingBean执行afterPropertiesSet
7.调用指定的初始化方法init(),
8.如果有一个自定义类实现了BeanPostProcessor接口(后处理Bean),执行postProcessAfterInitialization
9.执行业务处理方法
10.如果Bean实现了DisposableBean执行destroy
11.调用指定的销毁方法customerDestroy
不用完全记住,重点记住第五步和第八步,后处理Bean:自定义一个类实现BeanPostProcessor接口的方法。
这个后处理bean有什么作用呢?他是在我们整个类的生成的过程中要执行的一个步骤,那么他就可以对我们的类进行增强,即AOP思想。
属性的注入以及构造方法的属性的注入(具体见项目中spring配置文件)
- set方法的属性注入
- p名称空间的属性注入
- SpEL的属性注入
- 复杂类型的属性注入
5.SpringBean管理,注解方式(具体见项目spring_ioc_annotation)
要想使用注解的方式开发,除了需要spring的基本的四个jar包,还需要spring-aop的jar包。
具体的注解举例:
@Component:相当于@Controller、@Service、@Repository;只不过用后三者的话,代码更加清晰
@Autowired:默认按照类型进行注入
----如果存在两个相同类型的Bean,则按照名称注入
@Autowired注入时可以针对成员变量或者set方法
使用@Qualifier指定注入Bean的名称
使用Qualifier指定Bean名称后,注解Bean必须指定相同的名称