Spring Boot注解
Spring Boot注解
@Configuration
- 代替过去的老的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的只有一个时起效
@ConditionalOnExpression : SpEL表达式结果为true时
@ConditionalOnProperty : 参数设置或者值一致时起效
@ConditionalOnResource : 指定的文件存在时起效
@ConditionalOnJndi : 指定的JNDI存在时起效
@ConditionalOnJava : 指定的Java版本存在时起效
@ConditionalOnWebApplication : Web应用环境下起效
@ConditionalOnNotWebApplication : 非Web应用环境下起效