Spring容器中怎样添加组件????
1.@Configuration
通过该注解,可以替代xml实现完全注解开发
做法:
- 1.创建一个配置类,并在类上添加@Configuration注解
- 2 在方法中返回一个实例对象,并在方法中添加@Bean注解
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new HelloService();
}
}
注意:* @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
* @Bean :给容器添加组件,(在配置文件中用<bean><bean/>标签添加组件)
* 容器中组件默认的id就是方法名,可以通过@Bean("tom")自定义
- 配置类本身也是一个组件(实际上是一个代理对象)
- 从spring5.2以后,@Configuration注解中多了一个属性,默认是true
-默认是true代表:springboot总会检查该组件是否已经存在于容器中,如果容器中已经存在,就直接使用; 如果没有,才会调用该方法,这也就是说通过 @Bean生成的组件是单例的,无论外界调用多少次方法,获取多少次都是同一个组件
-如果将该属性置位false.则每调用一次方法,就会新创建一个组件
根据属性proxyBeanMethods的不同取值对应着@configuration的两种配置
proxyBeanMethods=true叫作Full(全配置)
proxyBeanMethods=false叫作Lite(轻量级配置)
之所以有这两种配置,
是为了解决组件依赖的问题
(所谓组件依赖就是一个组件中含有另一个组件)
>总结:如果我们注册的组件不依赖其他组件,那么就把proxyBeanMethods属性置位false,
相反如果组件中依赖了其他组件,就置为true
原因是:如果proxyBeanMethods为true,那么每次在调用方法时,都会先去容器中寻找有无该组件,试想如果你只是单纯一个组件,不依赖其他组件,那这样就会使你的项目加载变慢,影响性能,因此此时设为false较为合适;
相反,如果你的组件要依赖其他组件,那么此时应该设为true;
2 @controller,@Repository,@Service,@Component
这4个注解同样是添加组件的注解
3.@Import
该注解作用在普通类,配置类上,会通过调用无参构造方法给容器中导入主键;
导入的主件可以是普通类,也可以引入第三方jar包中的类
4.@Conditional(条件装配)
满足指定的条件,则进行组件注入
该注解是一个组合注解,拿@ConditionalOnBean注解为例
解释:该注解标在user01方法上,表示如果容器中有名为name注解的主件,才会创建User01主件,如果容器中不存在,那么就不会创建;
如果把@ConditionalOnBean标在类上,
表示如果容器中不存在名为tom的主件,那么该配置类中的所有主件都不会被创建
@Conditional扩展注解 | 作用(判断是否满足当前指定条件) |
---|---|
@ConditionalOnJava | 系统的java版本是否符合要求 |
@ConditionalOnBean | 容器中存在指定Bean; |
@ConditionalOnMissingBean | 容器中不存在指定Bean; |
@ConditionalOnExpression | 满足SpEL表达式指定 |
@ConditionalOnClass | 系统中有指定的类 |
@ConditionalOnMissingClass | 系统中没有指定的类 |
@ConditionalOnSingleCandidate | 容器中只有一个指定的Bean,或者这个Bean是首选Bean |
@ConditionalOnProperty | 系统中指定的属性是否有指定的值 |
@ConditionalOnResource | 类路径下是否存在指定资源文件 |
@ConditionalOnWebApplication | 当前是web环境 |
@ConditionalOnNotWebApplication | 当前不是web环境 |
@ConditionalOnJndi | JNDI存在指定项 |
5.@ImportResource
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上