扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
通过实现BeanDefinitionRegistry接口,并实现BeanDefinitionRegistry接口的registerBeanDefinition系列方法来将给定的BeanDefinition注册到BeanFactory中,实现类为DefaultListableBeanFactory 注册的bd保存到beanDefinitionMap中
1、BeanDefinitionReader接口
方法如loadBeanDefinitions 从xml文件或者类路径下使用了@Component系列注解的类、或者从@Configuration注解的配置类,获取BeanDefintiions,然后注册到BeanFactory中。
实现类XmlBeanDefinitionReader 读取解析xml文件,通过Parser解析xml文件的标签。针对beans标签,生成对应的BeanDefintions,然后注册到BeanFactory中。 针对其他有特殊功能的标签,如context:component-scan,context:anotation-config,还可以生成BeanFactoryPostProcessor,BeanPostProcessor接口实现类的bean等;除了可以生成BeanDefinitions之外,还可以实现其他功能。
NamespaceHandler:XML标签名称空间处理器 被XmlBeanDefinitionReader使用,XmlBeanDefinitionReader在处理每个XML标签名称空间的时候,如applicationContext.xml的context:mvc:,通过一个DefaultNamespaceHandlerResolver来获取对应的NamespaceHandler实现类,然后通过这个NamespaceHandler实现类,进一步获取该命名空间的内部标签对应的BeanDefinitionParser实现类。
handlerMappings保存在META-INF/spring.handlers中 每个handlers继承NamespaceHandlerSupport, 在内部init方法中通过调用registerBeanDefinitionParser注册标签与与对应的BeanDefinitionParser实现类 ,BeanDefinitionParser内部通过parse方法处理标签逻辑
BeanDefinitionDocumentReader 被XmlBeanDefinitionReader使用,专门用于处理xml文件的beans标签的标签处理器。即XmlBeanDefinitionReader读取xml文件,创建Document对象,然后交给BeanDefinitionDocumentReader处理。BeanDefinitionDocumentReader解析Document对象的Element节点,然后创建BeanDefinitions集合,通过XmlBeanDefinitionReader注册到XmlBeanDefinitionReader所在的BeanFactory。
2、AnnotatedBeanDefinitionReader
注册指定的类列表annotatedClasses 可以使用编程方法,显示指定将哪些类需要注册到BeanFactory,通过registerBean方法, 内部引用BeanDefinitionRegistry,最后通过registry.registerBeanDefinition注册到beanFactory中
主要是被AnnotationConfigApplicationContext使用,即基于注解配置的ApplicationContext,这是SpringBoot的默认ApplicationContext。典型使用为:先获取所有使用了@Configuration注解的类,然后通过AnnotatedBeanDefinitionReader生成与这些类对应的BeanDefinitions,并注册到BeanFactory。
3、ClassPathBeanDefinitionScanner
调用scan方法 注册指定的basePackages下面的类扫描指定类路径(包basePackages)下面的类,检测是否存在@Component注解及其子注解,从而生成BeanDefinition,然后注册到BeanFactory。
没有实现BeanDefinitionReader接口,与AnnotatedBeanDefinitionReader一样,都是获取指定类,生成该类的BeanDefinition注册到BeanFactory,而不是像xml文件一样已经通过bean标签显示说明这个就是bean。
三个使用场景:
1、被AnnotationConfigApplicationContext通过构造函数调用scan
2、在ComponentScanBeanDefinitionParser的parse方法中使用,处理context:component-scan标签
3、在ComponentScanAnnotationParser的parse方法中使用,处理@Configuration配置类上面的@ComponentScan注解
4、ConfigurationClassBeanDefinitionReader:处理@Configuration注解的配置类,加在这些配置类上面的注解,即与@Configuration一起使用的注解,如@ComponentScan,@PropertySource,@Import,@Profile等。
主要被ConfigurationClassPostProcessor(是一个BeanFactoryPostProcessor)调用,在调用postProcessBeanFactory时在内部的processConfigBeanDefinitions方法中使用
bean元数据解析执行者. xml文件的标签的解析处理器,通过实现 BeanDefinitionParser接口,来针对每个标签进行特定。典型用途包括:生成BeanDefintion对象,或BeanFactoryPostProcessor对象,或BeanPostProcessor对象,或者为针对标签定义特定的功能,自定义该标签的用途。Parser可以同时生成这三种类型中的一个或多个。如ComponentScanBeanDefinitionParser既生成BeanDefinitions,又生成ConfigurationClassPostProcessor(BeanFactoryPostProcessor接口实现类)。AnnotationConfigBeanDefinitionParser既生成BeanPostProcessor,又生成ConfigurationClassPostProcessor。
直接创建beanDefinition
DefaultBeanDefinitionDocumentReader、ComponentScanBeanDefinitionParser、ComponentScanAnnotationParser
间接创建BeanDefinition
创建BeanFactoryPostProcessor->ConfigurationClassPostProcessor:在ComponentScanBeanDefinitionParser和AnnotationConfigBeanDefinitionParser中会创建ConfigurationClassPostProcessor对象实例:这样由这些parser创建的BeanDefinitions,就可以被ConfigurationClassPostProcessor进一步处理,创建更多的BeanDefintions:
过滤获取使用了@Configuration注解的类,然后从这些类的@Bean方法获取BeanDefintions。
1、ComponentScanBeanDefinitionParser:对应context:component-scan,在parse方法调用;
2、AnnotationConfigBeanDefinitionParser:对应context:annotation-config,在parse方法调用;
3、ClassPathBeanDefinitionScanner:在scan方法调用,该类在AnnotationConfigApplicationContext中使用;
4、AnnotatedBeanDefinitionReader:在构造函数调用,该类在AnnotationConfigApplicationContext中使用。
1、CommonAnnotationBeanPostProcessor:处理bean对象及其方法中的JDK自身的注解; @PostConstruct、@PreDestroy
2、AutowiredAnnotationBeanPostProcessor:bean对象的依赖注入处理,如@Autowired、@Value 及jdk的@Inject
bean工厂后置处理器: BeanFactoryPostProcessorbean元数据注册的拓展,在BeanFactory创建好,加载好其所包含的所有beanDefinitions,但是还没有实例化bean之前,执行,具体为调用postProcessBeanFactory方法。
1. 加载更多的bean元数据
ConfigurationClassPostProcessor,用于从BeanFactory中检测使用了@Configuration注解的类,对于这些类对应的BeanDefinitions集合,遍历并依次交给ConfigurationClassParser,ConfigurationClassBeanDefinitionReader处理,分别是处理与@Configuration同时使用的其他注解和将类内部的使用@Bean注解的方法,生成BeanDefinition,注册到BeanFactory。
2. 对bean元数据进行加工处理
BeanDefinition属性填充、修改:在postProcessBeanFactory方法中,可以对beanFactory所包含的beanDefinitions的propertyValues和构造函数参数值进行修改,如使用PropertyPlaceHolderConfigurer来对BeanDefinition的propertyValues的占位符进行填充、赋值。或者使用PropertyResourceConfigurer获取config文件中属性,对BeanDefinitions的相关属性进行赋值或者值覆盖。
负责对已创建好的bean对象进行加工处理。主要是可以对新创建的bean实例进行修改,提供了一个类似于hook机制,对创建好的bean对象实例进行修改。
核心方法
postProcessBeforeInitialization:在创建好bean实例,但是在任何初始化回调执行之前,如InitializingBean的afterPropertiesSet,先执行该方法。
postProcessAfterInitialization:在创建好bean实例,并且所有的初始化回调都执行完了,如InitializingBean的afterPropertiesSet,再执行该方法。
BeanPostProcessor的注册
定义:在注解配置工具类AnnotationConfigUtils的静态方法registerAnnotationConfigProcessors方法中,定义注解的处理器的注册逻辑。
调用:在BeanFactoryPostProcessor中调用这个静态方法来完成将特定的BeanPostProcessor实现类,注册到ApplicationContext的BeanPostProcessor列表。
AutowiredAnnotationBeanPostProcessor:处理bean对象的依赖注入关系,即从BeanFactory获取该bean所依赖的bean,然后注入到该bean对应的成员变量中。
CommonAnnotationBeanPostProcessor:该bean中所使用了的JDK定义的注解的处理,如方法中的@PostConstruct,@PreDestroy,成员变量上的@Resource等。
PersistenceAnnotationBeanPostProcessor(JPA时添加):JPA相关bean的持久化处理。
1、通过实现SingletonBeanRegistry接口,实现类DefaultSingletonBeanRegistry, 方法registerSingleton ,保存到singletonObjects的map中,这个类中有三级缓存
//单例对象的缓存:bean名称到bean实例.
private final MapsingletonObjects = new ConcurrentHashMap<>(256);
//单例工厂的缓存:bean name到ObjectFactory.
private final Map>singletonFactories = new HashMap<>(16);
//早期单例对象的缓存:bean名称到bean实例。
private final MapearlySingletonObjects = new ConcurrentHashMap<>(16);
//已注册的单例bean的名称.
private final SetregisteredSingletons = new LinkedHashSet<>(256);
2、FactoryBean创建的bean对象容器FactoryBeanRegistrySupport:继承于DefaultSingletonBeanRegistry,映射map中的bean对象实例是通过调用FactoryBean的getObject方法获取的bean对象。
private final MapfactoryBeanObjectCache = new ConcurrentHashMap<>(16);
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流