记录一次spring的学习经历 springbean的生命周期加深理解

本文深入探讨了Spring框架中IOC容器的工作原理,重点讲解了如何使用BeanDefinitionRegistryPostProcessor接口来实现动态注入bean到IOC容器中,以及如何通过扩展ClassPathBeanDefinitionScanner来自定义扫描规则和设置bean属性。

对spring ioc容器中的bean 更加深度的理解 

在ioc容器中 spring 会把new出来的对象进行封装  变成 BeanDefintion 对象 然后在把封装好的对象,调用对应的BeanDefinitionRegistry注册到 Ioc容器中

这时候 spring 提供了一个 BeanDefinitionRegistryPostProcessor 接口 这是 spring 的后置处理器,这样的话我们就可以拦截到 BeanDefinitionRegistry对象 自己手动的想spring中的ioc动态注入对象 。

BeanDefinitionRegistryPostProcessor 还能进行扩展。可以当成扫包的对象的参数 传进去 ,这样就可以实现扫描特定包的类,进行动态注入 并且给这些类提供一些特异功能,

我们写一个类 自己继承 ClassPathBeanDefinitionScanner 这个类 这个是spring 扫描包的类

 

自定义过滤规则

 

    @Override
    protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
        // TODO Auto-generated method stub
        AnnotationMetadata metadata = beanDefinition.getMetadata();
        // 确定 这个类 是个接口
        // 并且这个类 没有 其他的实现类
        // 因为我们要进行代理
        return metadata.isInterface() && metadata.isIndependent();
    }

    private void addFile() {
        addIncludeFilter(new TypeFilter() {

            @Override
            public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
                    throws IOException {
                // TODO Auto-generated method stub
                return true;
            }
        });
    }
 

设置 扫描方法


    @Override
    protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
        // TODO Auto-generated method stub
        addFile();
        Set<BeanDefinitionHolder> doScan = super.doScan(basePackages);
        if (doScan != null && doScan.size() > 0) {
            for (BeanDefinitionHolder beanDefinitionHolder : doScan) {
                // 获得这个beanDefinition 并且 做转换 然后 设置基础属性
                GenericBeanDefinition beanDefinition = (GenericBeanDefinition) beanDefinitionHolder.getBeanDefinition();
                // 设置Autowire 的类型通过类型获取
                beanDefinition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
                // 设置构造参数类型
                beanDefinition.getConstructorArgumentValues()
                        .addGenericArgumentValue(beanDefinition.getBeanClassName());
                // 设置通过什么工厂生产 这个class

                beanDefinition.setBeanClass(BeanFactoryClass.class);
            }
        }
        return doScan;
    }
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值