@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的组件,加入到容器中,这么做的目的是防止有些用户配置的文件上传解析器(名字)不符合规范