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(){
}

SpringBoot 2 底层源码+主启动类部分分析

image-20230423203717288
image-20230423203717288