Spring IoC 小结
IoC的设计思想
- 控制:控制某个接口具体由哪个类实现。比如有一个Car接口,当这辆车要启动的时候,才决定是benz还是bmw实现Car。
- 反转:是谁控制,将控制权给到外部第三方或者容器手中,而不是实现类本身。比如people类启动Car。
- 控制+反转:比如people启动Car的时候,将benz或者bmw注入到Car中。
- 对比传统,new Car() 就是直接调用目标类,不存在控制反转。
Java反射技术对在IoC中的应用
- 几个重要的反射类:ClassLoader、Class、Constructor、Method,通过反射类可以直接调用目标Class的各项功能,在运行时调用,而不是编译时。
示例:以反射实现Car类
。
public static Car initByDefaultConst() throws Throwable{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.my.Car");//通过类加载器获取Car类对象
Constructor cons = clazz.getDeclaredConstructor((Class[])null);//获取类的默认构造器
Car car = (Car)cons.newInstance();//实例化Car
Method setBrand = clazz.getMethod("setBrand",String.class);//获取Car的属性方法
setBrand.invoke(car,"benz");
//...
return car;
}
- 在Spring里的反射:根据配置信息,使用反射在运行时构建bean
BeanFactory、ApplicationContext及WebApplicationContext基础接口
- BeanFactory是Spring最核心的接口:框架的基础设施,面向Spring
- ApplicationContext应用上下文:面向框架的使用者
示例:使用上下文装配bean
。
@Configuration
public class Beans {
@Bean(name = "car")
public Car buildCar() {
Car car = new Car();
car.setBrand("benz");
return car;
}
}
@Test
public void getBean(){
//AnnotationConfigApplicationContext加载Beans.class的Bean定义
ApplicationContext ctx = new AnnotationConfigApplicationContext(Beans.class);
Car car = ctx.getBean("car",Car.class);
assertNotNull(car);
}
- WebApplicationContext为Web应用准备
Bean的生命周期
-
Bean的作用域
singleton:Spring IoC 容器能够精确地控制 Bean 何时被创建、何时初始化完成以及何时被销毁。
prototype:Spring IoC 容器只负责创建,然后就将 Bean 的实例交给客户端代码管理,Spring IoC 容器将不再跟踪其生命周期。 -
实例化Bean时所经历的阶段:大致分为实例化、属性赋值、初始化、使用和销毁。
-
BeanFactory和ApplicationContext生命周期管理:
3.1 ApplicationContext继承了BeanFactory,扩展了AOP和Web等,框架使用者通常直接使用上下文。
3.2 ApplictionContext生命周期描述:
容器启动
(1)调用BeanFactoryProcessor的postProcessBeanFactory()
对工厂定义信息进行后处理
通过getBean()调用某一个Bean
(2)调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation()
(3)实例化
(4)调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation()
(5)调用InstantiationAwareBeanPostProcessor的postProcessPropertValue()
(6)设置属性值
(7)调用BeanNameAware的setBeanFactory()
(8)调用BeanFactoryAware的setBeanFactory()
(9)调用ApplicationContextAware的setApplicationContext()
(10)调用BeanPostProcess的postProcessBeforeInitialization()
(11)调用InitializingBean的afterPropertiesSet()
(12)通过init-method
属性配置的初始化方法
(13)调用BeanPostProcessor的postProcessAfterInitiationlization()
(14)singleton放入容器缓存池,prototype交付调用者
容器销毁
(15)调用DisposableBean的destory()
(16)通过destroy-method
属性配置的销毁方法 -
相较于传统:传统Java应用中bean的生命周期:使用new进行Bean的实例,使用Bean,一旦bean不再被使用,则由Java自动进行垃圾回收。
以上均为个人学习总结,如有错误请指正。