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()