代理
ProxyFactory
当需要手动给Bean
创建代理对象时,一般情况下通过CGLib或动态代理实现,在有些情况下还需要根据对象的类型区分使用生成代理的方式,可以通过ProxyFactory
快速生成一个代理类,并支持多个切面。
1 | public class Bean { |
AopUtils
在Spring
中,通过一些方式获取到的Bean
可能已经被增强,即可能被代理,获取被代理的对象可能会有一些意想不到的情况发生,例如通过代理对象获取类注解时可能将会获取不到。
AopUtils
提供一些方法来判断是否为代理对象,例如AopUtils#isAopProxy
;也可以调用AopUtils#getTargetClass
获取到被代理的对象类型等等。
Bean
BeanDefinitionBuilder
有些场景下,需要手动注册BeanDefinition
,可以通过BeanDefinitionBuilder
进行创建BeanDefinition
。建议通过BeanDefinitionBuilder#genericBeanDefinition
创建,因为GenericBeanDefinition
涵盖了RootBeanDefinition
和ChildBeanDefinition
的功能。
1 | BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(Bean.class); |
ClassPathBeanDefinitionScanner
在一些场景下,可能需要手动扫描某个路径下的类进行处理。例如MyBatis
通过扫描某个路径下的mapper接口自动生成mapper
实例。
ClassPathBeanDefinitionScanner#scan(String)
将会扫描入参路径,将其中的类解析为BeanDefinition
注册到当前容器中。
1 | BeanDefinitionRegistry registry = null; |
如果有必要,例如修改扫描到的BeanDefinition
,可以重写doScan
方法;如果不满足于addIncludeFilter
或addExcludeFilter
两类过滤器,可以重写isCandidateComponent
方法手动写条件进行过滤。