Spring容器中怎样添加组件????


1.@Configuration

通过该注解,可以替代xml实现完全注解开发
做法:

  • 1.创建一个配置类,并在类上添加@Configuration注解
  • 2 在方法中返回一个实例对象,并在方法中添加@Bean注解
@Configurationpublic class MyAppConfig {//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名@Beanpublic HelloService helloService02(){System.out.println("配置类@Bean给容器中添加组件了...");return new HelloService();}}

注意:
* @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件

* @Bean :给容器添加组件,(在配置文件中用<bean><bean/>标签添加组件)

* 容器中组件默认的id就是方法名,可以通过@Bean("tom")自定义

  • 配置类本身也是一个组件(实际上是一个代理对象)
  • 从spring5.2以后,@Configuration注解中多了一个属性,默认是true
    Springboot怎样通过注解的方式添加组件到容器中????_Spring容器
    - 默认是true代表:springboot总会检查该组件是否已经存在于容器中,如果容器中已经存在,就直接使用; 如果没有,才会调用该方法,这也就是说通过 @Bean生成的组件是单例的,无论外界调用多少次方法,获取多少次都是同一个组件
    - 如果将该属性置位false.则每调用一次方法,就会新创建一个组件

根据属性proxyBeanMethods的不同取值对应着@configuration的两种配置
proxyBeanMethods=true叫作Full(全配置)
proxyBeanMethods=false叫作Lite(轻量级配置)

之所以有这两种配置,
是为了解决组件依赖的问题
(所谓组件依赖就是一个组件中含有另一个组件)

Springboot怎样通过注解的方式添加组件到容器中????_Spring容器_02
>总结:如果我们注册的组件不依赖其他组件,那么就把proxyBeanMethods属性置位false,
相反如果组件中依赖了其他组件,就置为true
原因是:如果proxyBeanMethods为true,那么每次在调用方法时,都会先去容器中寻找有无该组件,试想如果你只是单纯一个组件,不依赖其他组件,那这样就会使你的项目加载变慢,影响性能,因此此时设为false较为合适;
相反,如果你的组件要依赖其他组件,那么此时应该设为true;

2 @controller,@Repository,@Service,@Component

这4个注解同样是添加组件的注解

3.@Import

该注解作用在普通类,配置类上,会通过调用无参构造方法给容器中导入主键;
导入的主件可以是普通类,也可以引入第三方jar包中的类
Springboot怎样通过注解的方式添加组件到容器中????_Spring容器_03

4.@Conditional(条件装配)

满足指定的条件,则进行组件注入

Springboot怎样通过注解的方式添加组件到容器中????_Spring容器_04
该注解是一个组合注解,拿@ConditionalOnBean注解为例
Springboot怎样通过注解的方式添加组件到容器中????_Spring容器_05
解释:该注解标在user01方法上,表示如果容器中有名为name注解的主件,才会创建User01主件,如果容器中不存在,那么就不会创建;

如果把@ConditionalOnBean标在类上,Springboot怎样通过注解的方式添加组件到容器中????_Spring容器_06
表示如果容器中不存在名为tom的主件,那么该配置类中的所有主件都不会被创建

@Conditional扩展注解作用(判断是否满足当前指定条件)
@ConditionalOnJava系统的java版本是否符合要求
@ConditionalOnBean容器中存在指定Bean;
@ConditionalOnMissingBean容器中不存在指定Bean;
@ConditionalOnExpression满足SpEL表达式指定
@ConditionalOnClass系统中有指定的类
@ConditionalOnMissingClass系统中没有指定的类
@ConditionalOnSingleCandidate容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty系统中指定的属性是否有指定的值
@ConditionalOnResource类路径下是否存在指定资源文件
@ConditionalOnWebApplication当前是web环境
@ConditionalOnNotWebApplication当前不是web环境
@ConditionalOnJndiJNDI存在指定项
5.@ImportResource

@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上

Springboot怎样通过注解的方式添加组件到容器中????_Spring容器_07

Springboot怎样通过注解的方式添加组件到容器中????_Spring容器_08