【Spring源码】DefaultListableBeanFactory 创建过程分析

上篇文章我们分析了 ClassPathResource 对资源文件的封装。

Resource resource = new ClassPathResource("applicationContext.xml");

接下来,我们继续往下分析,Spring中Bean工厂是如何创建的呢
我们这里是通过调用 DefaultListableBeanFactory 类的无参构造方法创建一个 BeanFactory 对象

DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();

DefaultListableBeanFactory 类的继承关系:
DefaultListableBeanFactory

/**
 * Create a new DefaultListableBeanFactory.
 */
public DefaultListableBeanFactory() {
    super();
}

DefaultListableBeanFactory 类通过 super() 方法调用了父类 AbstractAutowireCapableBeanFactory 的无参构造方法,继续跟踪 super()方法

/**
 * Create a new AbstractAutowireCapableBeanFactory.
 */
public AbstractAutowireCapableBeanFactory() {
    super();
    ignoreDependencyInterface(BeanNameAware.class);
    ignoreDependencyInterface(BeanFactoryAware.class);
    ignoreDependencyInterface(BeanClassLoaderAware.class);
}

同样的,AbstractAutowireCapableBeanFactory 首先通过 super() 方法调用了父类 AbstractBeanFactory 的无参构造方法,
AbstractBeanFactory 类的构造方法空实现。

/**
 * Create a new AbstractBeanFactory.
 */
public AbstractBeanFactory() {
}

接着连续调用了3次 ignoreDependencyInterface 方法

/**
 * Ignore the given dependency interface for autowiring.
 * <p>This will typically be used by application contexts to register
 * dependencies that are resolved in other ways, like BeanFactory through
 * BeanFactoryAware or ApplicationContext through ApplicationContextAware.
 * <p>By default, only the BeanFactoryAware interface is ignored.
 * For further types to ignore, invoke this method for each type.
 * @see org.springframework.beans.factory.BeanFactoryAware
 * @see org.springframework.context.ApplicationContextAware
 */
public void ignoreDependencyInterface(Class<?> ifc) {
    this.ignoredDependencyInterfaces.add(ifc);
}

ignoreDependencyInterface() 方法实现非常简单,就是将参数ifc 添加到成员变量 ignoredDependencyInterfaces 集合中。

/**
 * Dependency interfaces to ignore on dependency check and autowire, as Set of
 * Class objects. By default, only the BeanFactory interface is ignored.
 */
private final Set<Class<?>> ignoredDependencyInterfaces = new HashSet<>();

调用了3次 ignoreDependencyInterface() 方法分别将 BeanNameAware、BeanFactoryAware、BeanClassLoaderAware
三个类的Class对象添加到成员变量 ignoredDependencyInterfaces 的 Set 集合中
至于Set 集合中的元素后面会在什么地方使用,后面文章会分析。

看下 ignoreDependencyInterface() 方法的注释,翻译下就是自动装配时忽略指定的依赖接口。看起来有点懵。
实际上是忽略该接口的实现类中和接口setter方法入参类型相同的依赖。
比如 Person类有个成员变量 private User user,Person 类实现了UserAware接口

public interface UserAware {

    void setUser(User user);
}

Person 类中 setUser() 方法的实现

import com.geekymv.spring.UserAware;

public class Person implements UserAware {

    private User user;

    @Override
    public void setUser(User user) {
        this.user = user;
    }

    public User getUser() {
        return user;
    }
}

如果我们调用了 beanFactory.ignoreDependencyInterface(UserAware.class); 方法忽略 UserAware 接口,
那么 Spring 就不会为 Person 类的 user 属性自动装配。

更多 ignoreDependencyInterface() 方法的使用请参考以下文章

  • https://www.jianshu.com/p/3c7e0608ff1f
  • http://yangbolin.cn/2016/11/12/spring-work-01

以上就是调用 DefaultListableBeanFactory 类的无参构造方法来创建 BeanFactory 对象的全部内容。

更多精彩内容请关注公众号 geekymv,喜欢请分享给更多的朋友哦」

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值