spring动态代理与生命周期

Spring动态代理的两种方式,动态代理创建对象过程可分为以下四个步骤:

1)通过实现InvocationHandler接口创建自己的调用处理器 IvocationHandler handler = new InvocationHandlerImpl(...);

2)通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类

Class clazz = Proxy.getProxyClass(classLoader,new Class[]{...});

3)通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型

Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});

4)通过构造函数创建代理类实例,此时需将调用处理器对象作为参数被传入

Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler));

为了简化对象创建过程,Proxy类中的newProxyInstance方法封装了2~4,只需两步即可完成代理对象的创建。

生成的ProxySubject继承Proxy类实现Subject接口,实现的Subject的方法实际调用处理器的invoke方法,而invoke方法利用反射调用的是被代理对象的的方法(Object result=method.invoke(proxied,args))cglib动态代理是生成被代理类的子类,并覆盖其中方法进行增强。

Spring的生命周期:

1)先实例化Bean工厂后处理器(Bean工厂处理器的实例化是先于bean的实例化的)

2)实例化Bean后处理器(BeanPostProcessor)

3)实例化感知的bean后处理器适配器(InstantiationAwareBeanPostProcessorAdapter)

4)执行Bean构造器,bean正式实例化

在实例化之前会先去调用postProcessBeforeInstantiation方法

在实例化之后就去调用postProcessAfterInitialization方法

在这里实例化就是调用postProcessPropertyValues去为所要实例化的bean注入属性

5)调用BeanNameAware接口

6)调用BeanFactoryAware接口

7)调用Bean后处理器的postProcessBeforeInstantiation方法对属性进行更改

8)调用InitializingBean.afterPropertiesSet() ,检查是否已经set所有必要属性,之后调用的init-method属性指定的初始化方法

9)调用Bean后处理器的postProcessAfterInitialization对属性进行更改

10)调用后处理器适配器的postProcessAfterInitialization

11)容器初始化成功,使用bean

12)调用DiposibleBean接口的DiposibleBean.destory()

点击此处
隐藏目录