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

2023-01-08 16:26:32

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标注在一个配置类上

在这里插入图片描述

在这里插入图片描述

  • 作者:不秃头的小黄人
  • 原文链接:https://blog.csdn.net/weixin_46273997/article/details/115283761
    更新时间:2023-01-08 16:26:32