文章目录
自动配置简介
SpringBoot应用程序通过@SpringBootApplication
注解来实现自动配置,虽然127个场景的所有自动配置启动的时候默认全部加载,但我们需要按需开启自动配置项,通过条件装配规则注解@Conditional
来进行配置。
@SpringBootApplication
是一个复合注解,@SpringBootConfiguration
说明这是一个配置类,里面有一个@EnableAutoConfiguration
注解表示开启自动配置功能,自动配置了常见的第三方工具,例如mybatis、redis、OAuth2、Rabbitmq等。
spring官网提供了所有的自动配置属性,可参考: https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/htmlsingle/
在@EnableAutoConfiguration
注解中,@AutoConfigurationPackage
指定了默认的包规则,@Import(AutoConfigurationImportSelector.class)
,给容器中导入所有需要导入到容器的组件,并配置好这些组件。
SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先。
SpringBoot容器注入
@Configuration
:说明这个类是配置类,在类中的方法中添加@Bean注解(返回一个实例对象),在spring5.2以后,该注解添加了一个属性proxyBeanMethods,默认是true,保证每个@Bean方法被调用多少次返回的组件都是单实例的,当为false时,说明每个@Bean方法被调用多少次返回的组件都是新创建的,一般情况下组件依赖(一个组件中含有另一个组件)必须使用true,其他是false比较合适
@Bean
:给容器添加组件,组件的默认id就是方法名,可以通过@Bean(”名字")自定义
@Configuration
public class MyConfig {
@Bean("yaoqi")//更改组件名
public yaoqiService yaoqiservice(){
return new yaoqiService();
}
}
@Component、@Controller、@Service、@Repository
:同样也是添加组件的注解,主要用于区分组件的功能
@Conditional
:条件装配,满足某些条件才会添加组件,是一个组合注解
常见的要求:
-
@ConditionalOnJava:系统的java版本是否符合要求
-
@ConditionalOnBean:容器中存在指定Bean;
-
@ConditionalOnMissingBean:容器中不存在指定Bean;
-
@ConditionalOnExpression:满足SpEL表达式指定
-
@ConditionalOnClass:系统中有指定的类
-
@ConditionalOnMissingClass:系统中没有指定的类
-
@ConditionalOnSingleCandidate:容器中只有一个指定的Bean,或者这个Bean是首选Bean
-
@ConditionalOnProperty:系统中指定的属性是否有指定的值
-
@ConditionalOnResource:类路径下是否存在指定资源文件
-
@ConditionalOnWebApplication:当前是web环境
-
@ConditionalOnNotWebApplication:当前不是web环境
-
@ConditionalOnJndi:JNDI存在指定项
//如果容器中不存在名为yaoqi的组件,那么该配置类中的所有主件都不会被创建
@ConditionalOnBean(name="yaoqi")
public class MyConfig {
//如果容器中有名为yao注解的主件,才会创建yaoqiService组件
@ConditionalOnBean(name="yaoqi")
public yaoqiService yaoqiservice(){
return new yaoqiService();
}
}
@Import
:该注解作用在配置类上,通过调用无参构造方法给容器中创建组件,默认名字就是全类名
@ImportResource
:我们自己编写的Spring配置文件是不能自动引用的,@ImportResource标注在一个配置类上,就能加载Spring的配置文件,
@ImportResource("classpath:spring.xml")
public class MyConfig {}