欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

@Configuration

程序员文章站 2022-07-14 09:02:24
...

作用

  声明当前类是一个配置类,相当于一个Spring的XML配置文件,与@Bean配合使用。
  

Instead of using the XML files, we can use plain Java classes to annotate the configurations by using the @Configuration annotation. If you annotate a class with @Configuration annotation, it indicates that the class is used for defining the beans using the @Bean annotation. This is very much similar to the element in the spring XML configurations.

@Configuration
public class JavaConfig {
    @Bean(name="userDetails")
    public UserDetails userDetails(){
        return new UserDetails();
    }
}

@Configuration VS @Component

  • 共同点:都可以用于创建Bean;
  • 不同点:实现原理不同,@Configuration基于CGlib代理实现,@Component基于反射实现;
  • 使用场景:@Configuration用于全局配置,比如数据库相关配置,MVC相关配置等;业务Bean的配置使用注解配置(@Component,@Service,@Repository,@Controller)。

解析器注册时机

  SpringApplication使用AnnotatedBeanDefinitionReader解析基于注解的Java配置,在AnnotatedBeanDefinitiaonReader构造方法中,AnnotationConfigUtils.registerAnnotationConfigProcessors(registry)为Java配置所使用到的注解添加后置处理器,其中有一个为ConfigurationClassPostProcessor
@Configuration
@Configuration

@Configuration

解析时机

  AbstractApplicationContext的invokeBeanFactoryPostProcessors会触发调用BeanFactoryPostProcessor,ConfigurationClassPostProcessor作为@Configuration的解析器同样实现了BeanFactoryPostProcessor接口。
@Configuration

解析器处理逻辑

  ConfigurationClassPostProcessor在postProcessBeanFactory中的主要逻辑是对配置类进行增强,如下所示:
@Configuration

public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
        Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
        Assert.notNull(environment, "Environment must not be null");
        this.registry = registry;
        this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
        AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
    }

@Configuration

增强逻辑

  1. 首先,将所有标注@Configuration的Bean筛选出来;
  2. 其次,对每个配置类使用CGlib进行增强;
  3. 对方法调用进行代理,防止嵌套调用时出现多个不同实例,具体可查看ConfigurationClassEnhancer;

参考:

  1. https://javabeat.net/javaconfig-spring-3-0/
  2. http://blog.longjiazuo.com/archives/1265
  3. https://blog.csdn.net/isea533/article/details/78072133
  4. https://blog.csdn.net/fuckaholic/article/details/78307100