@Bean,@ConditionalOnBean的作用是什么?

@Bean的作用是将该组件注入到容器中
@ConditionalOnBean 当容器中存在这个类型组件,才进行组件注入
@ConditionalOnMissingBean 当容器中没有这个组件时,才注入组件

这三个注解经常标在方法上,进行组件注入

接下来代码演示一下这三个注解的基本使用
先来一个最基本的实体类

@AllArgsConstructor
@Data	//lombok注解,简化set get,重点不是这个插件
public class Computer {

    private String name;
}

演示@Bean注解的使用

配置类:
@Bean注解可以将组件注入到容器中,组件的名字默认是方法名

@Configuration
public class BeanConfig {

    @Bean
    public Computer computer(){
        return new Computer("主机");
    }

怎么检验容器中是否存在computer对象呢?
这里可以使用主启动类做测试,主启动类可以返回ioc容器

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
        System.out.println("########################");
        Object computer = run.getBean("computer");
        System.out.println(computer);

在这里插入图片描述
容器中的确注入了该对象

演示@ConditionalOnMissingBean注解的使用

Spring容器中不存在指定class的实例对象时,对应的配置才生效。

@Configuration
public class BeanConfig {

    @ConditionalOnMissingBean(String.class)
    public Computer computer(){
        return new Computer("主机");
    }

启动类的代码不变,报异常了,说明该注解相当于条件判断,无法单独使用,需要配合其它组件注入(@Service,@Bean等)来使用
在这里插入图片描述
只需要在@ConditionalOnMissingBean上再加一个@Bean一起使用即可。
在这里插入图片描述
运行结果
在这里插入图片描述

@Conditional

条件装配:满足Conditional指定的条件,则进行组件注入
如果有多个@Conditional时,需要全部满足才能进行组件注入
@Conditional条件无法单独使用,需要配合@Bean,@Configuration,@Bean,@Controller等使用。
在这里插入图片描述

Servlet自动配置类
DispatcherServletAutoConfiguration类中有这样一段代码

@Bean
@ConditionalOnBean(MultipartResolver.class)	//容器中有这个类型组件,则当前Bean进行组件注入
//容器中没有这个名字 multipartResolver 的组件,则当前Bean进行组件注入
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
public MultipartResolver multipartResolver(MultipartResolver resolver) {
   // 给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。
   // SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范
   // Detect if the user has created a MultipartResolver but named it incorrectly
   return resolver;
}
//给容器中加入了文件上传解析器;

这段代码的作用是:当容器中有 MultipartResolver这个类型组件,但不是multipartResolver这个名字时,由于给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。然后返回名字是multipartResolver的组件,加入到容器中,这么做的目的是防止有些用户配置的文件上传解析器(名字)不符合规范

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值