Spring IoC 小结

IoC的设计思想

  1. 控制:控制某个接口具体由哪个类实现。比如有一个Car接口,当这辆车要启动的时候,才决定是benz还是bmw实现Car。
  2. 反转:是谁控制,将控制权给到外部第三方或者容器手中,而不是实现类本身。比如people类启动Car。
  3. 控制+反转:比如people启动Car的时候,将benz或者bmw注入到Car中。
  4. 对比传统,new Car() 就是直接调用目标类,不存在控制反转。

Java反射技术对在IoC中的应用

  1. 几个重要的反射类: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;
}
  1. 在Spring里的反射:根据配置信息,使用反射在运行时构建bean

BeanFactory、ApplicationContext及WebApplicationContext基础接口

  1. BeanFactory是Spring最核心的接口:框架的基础设施,面向Spring
  2. 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);
}
  1. WebApplicationContext为Web应用准备

Bean的生命周期

  1. Bean的作用域
    singleton:Spring IoC 容器能够精确地控制 Bean 何时被创建、何时初始化完成以及何时被销毁。
    prototype:Spring IoC 容器只负责创建,然后就将 Bean 的实例交给客户端代码管理,Spring IoC 容器将不再跟踪其生命周期。

  2. 实例化Bean时所经历的阶段:大致分为实例化、属性赋值、初始化、使用和销毁。

  3. BeanFactoryApplicationContext生命周期管理:
    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属性配置的销毁方法

  4. 相较于传统:传统Java应用中bean的生命周期:使用new进行Bean的实例,使用Bean,一旦bean不再被使用,则由Java自动进行垃圾回收。


以上均为个人学习总结,如有错误请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值