通过在类级别上用@Configuration注解,方法上用@Bean注解显式注入Bean 。 类似xml配置中通过<beans><bean><bean></beans>来显式注入Bean。
如果被@Bean注解的方法中有参数,那么这些参数一定是存在于spring容器中的Bean,可以进行依赖注入。
方法中参数依赖注入规则如下:methods-inter-dependency相关文章
通过类型注入通过Bean的名称注入通过Bean的名称和@qulifier(“Bean的名称”) 匹配来注入通过双方使用@qualifier进行匹配来注入当然其中ImportBeanDefinitionRegistrar的registerBeanDefinitions方法调用是在spring容器初始化的时候完成的,spring通过@Configuration注解类获取相关配置类信息ConfigurationClass.java,ConfigurationClass类中
private final Map<ImportBeanDefinitionRegistrar, AnnotationMetadata> importBeanDefinitionRegistrars = new LinkedHashMap<ImportBeanDefinitionRegistrar, AnnotationMetadata>();这一段代码就是存储实现importBeanDefinitionRegistrar 接口的实例,用于解析注册配置的Bean定义,最后在有spring容器生成Bean。
一般用法:因为要重写registerBeanDefinitions方法,registerBeanDefinitions方法的参数为importingClassMetadata和beanDefinitionRegistry 。所以可以通过importingClassMetadata获取注解中的属性值,再通过beanDefinitionRegistry 注册Bean定义。那么就可以在注解上通过@Import导入实现了ImportBeanDefinitionRegistrar 接口的配置类。
例子:
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(SomeThingConfigRegistrar.class) public @interface EnableSomeThing{ String value() default ""; } public class SomeThingConfigRegistrar implements ImportBeanDefinitionRegister{ @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { AnnotationAttributes attributes = AnnotationAttributes.fromMap( importingClassMetadata.getAnnotationAttributes(EnableSomeThing.class.getName())); ...... //通过attributes对BeanDefinition进行填充,如构造器参数 //通过注册表register进行Bean定义注册 } }实现ImportBeanDefinitionRegistrar接口后遇到的问题:加载顺序,enviroment 依赖注入(通过实现EnvironmentAware接口),registerBeanDefinition,的顺序
…不解释