spring初始化策略
来源:互联网 发布:2016美国非农就业数据 编辑:程序博客网 时间:2024/05/15 01:54
实例化对象,spring核心用到两个类,分别是
java.lang.reflect.Constructor和org.springframework.cglib.proxy.Enhancer,具体是ctor.newInstance(args)和enhancer.create()。
1、bean的创建,主要是AbstractAutowireCapableBeanFactory.doCreateBean方法内。这个方法内,有bean的实例化、初始化、代理处理等,这里只说实例化的问题。AbstractAutowireCapableBeanFactory.doCreateBean方法内会调用AbstractAutowireCapableBeanFactory.createBeanInstance方法。
2、AbstractAutowireCapableBeanFactory.createBeanInstance方法会调用AbstractAutowireCapableBeanFactory.instantiateBean方法。
3、AbstractAutowireCapableBeanFactory.instantiateBean方法内,会执行getInstantiationStrategy().instantiate(mbd, beanName, parent)代码。先通过AbstractAutowireCapableBeanFactory.getInstantiationStrategy()方法会返回InstantiationStrategy接口的实例,这个方法内的实现是返回AbstractAutowireCapableBeanFactory类的instantiationStrategy属性,默认是CglibSubclassingInstantiationStrategy。然后调用InstantiationStrategy接口实例的instantiate方法。这里,默认调用的是CglibSubclassingInstantiationStrategy的instantiate方法。
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {........./** Strategy for creating bean instances */private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();/** * Return the instantiation strategy to use for creating bean instances. */protected InstantiationStrategy getInstantiationStrategy() {return this.instantiationStrategy;}.........}
4、instantiate方法的调用。因为CglibSubclassingInstantiationStrategy类并没有instantiate方法,所以这里调用的是CglibSubclassingInstantiationStrategy类的父类SimpleInstantiationStrategy的instantiate方法。SimpleInstantiationStrategy类的instantiate方法内,根据类是否配置lookup-method或者replaced-method标签或者@Lookup注解,而调用两种不同的方式实例化bean。没有配置,则调用BeanUtils.instantiateClass(Constructor<T> ctor, Object... args)方法;配置了则调用CglibSubclassingInstantiationStrategy.instantiateWithMethodInjection(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner)方法。
public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationStrategy {...}
public class SimpleInstantiationStrategy implements InstantiationStrategy {...}
5、BeanUtils.instantiateClass方法的调用。BeanUtils.instantiateClass方法内,会通过反射类java.lang.reflect.Constructor的实例,实例化对象,代码ctor.newInstance(args)。
这个也反向说明了,在一定情况下,在spring中,如果自定义了构造方法,那么一定要实现无参构造方法。因为spring初始化时,因为配置原因,很可能最终调用的是类的无参构造方法初始化的。而实现了自定义构造方法后,编译器就不会再自动为我们生成无参构造函数了。
6、CglibSubclassingInstantiationStrategy.instantiateWithMethodInjection方法调用。方法内,会创建CglibSubclassCreator类实例,然后调用CglibSubclassCreator类实例的instantiate方法。CglibSubclassCreator类是CglibSubclassingInstantiationStrategy类的内部类。
import java.lang.reflect.Constructor;import org.springframework.cglib.proxy.Enhancer;public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationStrategy {@Overrideprotected Object instantiateWithMethodInjection(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) {// Must generate CGLIB subclass.return new CglibSubclassCreator(beanDefinition, owner).instantiate(null, null);}@Overrideprotected Object instantiateWithMethodInjection(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner,Constructor<?> ctor, Object[] args) {return new CglibSubclassCreator(beanDefinition, owner).instantiate(ctor, args);}/** * An inner class created for historical reasons to avoid external CGLIB dependency * in Spring versions earlier than 3.2. */private static class CglibSubclassCreator {private static final Log logger = LogFactory.getLog(CglibSubclassCreator.class);private final RootBeanDefinition beanDefinition;private final BeanFactory owner;public CglibSubclassCreator(RootBeanDefinition beanDefinition, BeanFactory owner) {this.beanDefinition = beanDefinition;this.owner = owner;}/** * Create a new instance of a dynamically generated subclass implementing the * required lookups. * @param ctor constructor to use. If this is {@code null}, use the * no-arg constructor (no parameterization, or Setter Injection) * @param args arguments to use for the constructor. * Ignored if the {@code ctor} parameter is {@code null}. * @return new instance of the dynamically generated subclass */public Object instantiate(Constructor<?> ctor, Object[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.beanDefinition.getBeanClass());enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);enhancer.setCallbackFilter(new CallbackFilterImpl());enhancer.setCallbacks(new Callback[] {NoOp.INSTANCE,new LookupOverrideMethodInterceptor(),new ReplaceOverrideMethodInterceptor()});//使用cglib的create生成实例化的bean对象return (ctor != null ? enhancer.create(ctor.getParameterTypes(), args) : enhancer.create());}}
- spring初始化策略
- 初始化对象策略
- spring初始化
- Spring初始化
- Spring初始化
- Spring初始化
- Spring初始化
- Spring初始化
- Spring初始化
- Spring初始化
- 深度学习参数初始化策略
- spring事务--传播策略
- Spring Security加密策略
- spring事物策略
- Spring 数据访问策略
- spring事务策略
- Spring Security加密策略
- Spring Security加密策略
- javascript中的继承
- POJ1644-(放苹果)-递归
- (转)android studio 快捷键
- C++STL优先级队列priority_queue
- 【CV】ORB源码详解-描述子的建立
- spring初始化策略
- Android Flags:FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS学习
- 规划将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager
- 解决input自动填充问题
- JavaScript的数据类型及转换
- 分布式文件系统
- 新手看Java中的集合类(零)
- vue之过渡效果
- av_rescale_q