SpringBoot2 底层注解
@Configuration
与@Component
同作用,但能让其他人更方便地识别为配置类;
该注解源码中有一行代码:
boolean proxyBeanMethods() default true;
1.自定义的配置类,相当于xml配置文件,配置类本身也是组件
2.配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
3.属性proxyBeanMethods
- Full模式:默认是true
用来监测当前IOC容器中是否有此实例,若有则不会再创建,直接返回此单实例;
当前配置类的实例信息:com.example.springboot.config.MyConfig1$$EnhancerBySpringCGLIB$$7c35a8af@aa21042 代理对象
- Lite模式:指定为false
每一次调用都会创建新的实例;
当前配置类的实例信息:com.example.springboot.config.MyConfig1@45673f68
使用场景总结:
- Lite模式,指定proxyBeanMethods值为false,配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置
- Full模式,默认指定proxyBeanMethods值为true,类组件之间有依赖关系,方法会被调用得到之前单实例组件
注册实例bean至IOC容器中的方法
方式一
@Configuration + @Bean
会将添加了@Bean注解的方法的返回值注册到IOC容器中
以方法明作为beanName存在。
方式二
@Configuration + @Import( {xxx.class})
将指定的class对象注册至IOC容器中,
以全类名作为beanName存在。全类名:包名.类名
方式三
@Configuration + @ImportResource( {"classpath:xxx.xml"})
将xml配置文件中的实例bean,注册到容器中,翻新SpringMVC项目时常用。
@Import( { })
将指定的class对象注册至IOC容器中,以全类名作为beanName存在。
@Conditional
一般称为条件装配。
分为:
@ConditionalONXxx
表示一定具备需要提供的内容,此处才生效
@ConditionalMissingXxx
表示一定没有提供此内容,此配置才生效
例如:@ConditionalOnBean
, @ConditionalMissingBean
实例代码:
@Configuration
//一旦IOC容器中未提供Car实例,则此处MyConfig生效
@ConditionalOnMissingBean(Car.class)
public class MyConfig(){
}
@Configuration
//一旦IOC容器中提供Car实例,则此处MyConfig生效
@ConditionalOnClass(Car.class)
public class MyConfig(){
}