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


原创粉丝点击