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

被折叠的 条评论
为什么被折叠?



