Spring Boot注解@Configuration

Spring Boot注解

Spring Boot注解

@Configuration

  1. 代替过去的老的XML配置,
@Configuration
public class Conf {
    @Bean
    public Car car() {
        Car car = new Car();
        car.setWheel(wheel());
        return car;
    }

    @Bean"wheel1")
    public Wheel wheel() {
        return new Wheel();
    }
}

proxyBeanMethods的属性,而且其默认值还是true, 代理bean的方法
我们在外部无论对配置类中的组件注册方法调用多少次,获取到的都是之前注册到容器中的单实例对象

Configuration是被 Spring CGLIB增强了的代理对象,所以,可以这样说,我们获取到的配置类组件本身就是一个代理对象。当我们在外部通过该代理对象来调用其方法时,那么Spring Boot里面的默认逻辑就是这样子的,即Spring Boot默认会检查容器中是否有该方法已经返回了的组件,若有则不会新创,而是直接拿,简简单单一句话,就是要保持组件单实例, 前提 @Configuration(proxyBeanMethods = true

@Configuration(proxyBeanMethods = false
此时我们从容器中拿到的MyConfig类型的组件就不再是代理对象了,而是一个普普通通的对象,而且,还能看到两次调用user01方法获取到的两个User对象不再是同一个对象了

Full:即@Configuration(proxyBeanMethods = true),一般称为全配置
Lite:即@Configuration(proxyBeanMethods = false),一般称为轻量级配置

组件依赖必须使用默认的Full模式,其他则默认使用Lite模式

将配置类编写为轻量级模式优点就是Spring Boot不会来检查组件注册的方法(例如user01方法)返回的东东在容器中有没有,相当于就跳过了检查,这样,我们整个Spring Boot应用启动并运行起来就非常快了。而如果是将配置类编写为全模式,那么外界对它里面的方法的每一次调用,Spring Boot都会检查容器中是不是有了该方法已经返回了的组件

EnableAutoConfiguration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

其中最关键的要属@Import(AutoConfigurationImportSelector.class),借助AutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。

借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成!

在AutoConfigurationImportSelector类中可以看到通过 SpringFactoriesLoader.loadFactoryNames()
把 spring-boot-autoconfigure.jar/META-INF/spring.factories中每一个xxxAutoConfiguration文件都加载到容器中,spring.factories文件里每一个xxxAutoConfiguration文件一般都会有下面的条件注解:

@ConditionalOnClass : classpath中存在该类时起效
@ConditionalOnMissingClass : classpath中不存在该类时起效
@ConditionalOnBean : DI容器中存在该类型Bean时起效
@ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
@ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效
@ConditionalOnExpressionSpEL表达式结果为true@ConditionalOnProperty : 参数设置或者值一致时起效
@ConditionalOnResource : 指定的文件存在时起效
@ConditionalOnJndi : 指定的JNDI存在时起效
@ConditionalOnJava : 指定的Java版本存在时起效
@ConditionalOnWebApplicationWeb应用环境下起效
@ConditionalOnNotWebApplication : 非Web应用环境下起效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值