SpringBoot @Import与@Conditional注解使用详解
作者:一根头发学一年 时间:2023-12-14 16:42:45
说明:基于atguigu学习笔记。
在了解spring boot自动配置原理前,再来了解下两个注解@Import注解和@Conditional注解。
@Import
@Import注解主要用于导入某些特殊的Bean,这些特殊的Bean和Bean Definitaion 有关。
主要用于导入@Configuration 类,ImportSelector和ImportBeanDefinitionRegistrar接口的实现类。
@Import可以添加在@SpringBootApplication(启动类)、@Configuration(配置类)、@Component(组件类)对应的类上。
一般在Spring boot 中配置都一般都是自动导入的,所以我们不需要使用@Import,但是如果你你想导入的配置类不在自动扫包路径,那么该配置类就需要使用@Import导入,尤其是第三方jar包的配置类都需要借助@Import来导入。
这里我们首先熟悉基本语法,具体的用法后面再学。
示例:
还使用上一章里项目示例:@Configuration注解和@Bean注解
使用 @Import导入我们需要的类,这里导入我们自己创建的类和第三方logback jar包里的类,如下:
config类:
package com.example.ethan.config;
import ch.qos.logback.core.db.DBHelper;
import com.example.ethan.bean.Dept;
import com.example.ethan.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods=true)
public class ConfigDemo {
@Bean
public User user01(){
User zhangsan = new User("zhangsan", 18);
//user组件依赖了Dept组件
zhangsan.setDept(rd());
return zhangsan;
}
@Bean("my rd")
public Dept rd(){
return new Dept("研发部");
}
}
主程序
package com.example.ethan;
import ch.qos.logback.core.db.DBHelper;
import com.example.ethan.bean.Dept;
import com.example.ethan.bean.User;
import com.example.ethan.config.ConfigDemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class EthanApplication {
public static void main(String[] args) {
// 返回ioc容器
ConfigurableApplicationContext run = SpringApplication.run(EthanApplication.class, args);
// 只查看User类型的Bean
String[] beanDefinitionNames = run.getBeanNamesForType(User.class);
System.out.println("========================");
for (String name : beanDefinitionNames) {
System.out.println(name);
}
DBHelper bean = run.getBean(DBHelper.class);
System.out.println(bean);
// com.example.ethan.bean.User
//user01
//ch.qos.logback.core.db.DBHelper@67207d8a
}
}
可以看到,使用 @Import注解,会给容器中自动创建出这两个类型的Bean,且Bean的名字是全类名。
@Conditional
满足Conditional指定的条件,则进行注入指定Bean。
@Conditional是一个根注解,下面还派生了许多其他注解
@Conditional注解可以加在方法上也可以加在类上。当加在类上,当条件不成立,类中所有代码都不执行,如果加在方法上,则只这个方法不执行。
下面以@ConditionalOnBean(条件是判断是否含有某个Bean)为例,演示代码如下:
首先放在方法上:
package com.example.ethan.config;
import com.example.ethan.bean.Dept;
import com.example.ethan.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods=true)
public class ConfigDemo {
@Bean("my rd")
public Dept rd(){
return new Dept("研发部");
}
@Bean
@ConditionalOnBean(name = "my rd")
public User user01(){
User zhangsan = new User("zhangsan", 18);
//user组件依赖了Dept组件
zhangsan.setDept(rd());
return zhangsan;
}
}
主程序:
package com.example.ethan;
import ch.qos.logback.core.db.DBHelper;
import com.example.ethan.bean.Dept;
import com.example.ethan.bean.User;
import com.example.ethan.config.ConfigDemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class EthanApplication {
public static void main(String[] args) {
// 返回ioc容器
ConfigurableApplicationContext run = SpringApplication.run(EthanApplication.class, args);
boolean my_rd = run.containsBean("my rd");
System.out.println("容器中含有my rd这个Bean:" + my_rd);
boolean user01 = run.containsBean("user01");
System.out.println("容器中含有user01这个Bean:" + user01);
}
}
这时候两个好结果都是true,因为按照顺序注入Bean时,先注入了"my rd"这个Bean到容器,然后在注入user01时,检查容器中含有my rd"这个Bean,就把user01也注入了。
如果把条件里name改为不存在的如"my rd02",那么入user01就不会注入容器。
下面把注解放到类上:
package com.example.ethan.config;
import com.example.ethan.bean.Dept;
import com.example.ethan.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods=true)
@ConditionalOnBean(name = "my rd")
public class ConfigDemo {
@Bean("my rd")
public Dept rd(){
return new Dept("研发部");
}
@Bean
public User user01(){
User zhangsan = new User("zhangsan", 18);
//user组件依赖了Dept组件
zhangsan.setDept(rd());
return zhangsan;
}
}
这时候两个Bean都不会注入容器,因为在执行这个类时检查条件不成立。
这里对@ConditionalOnBean有个初步了解,具体何种用法类似,可举一反三。
参考:
SpringBoot之@Import注解使用
来源:https://blog.csdn.net/qq_43745578/article/details/127251080
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
@SpringBootTest 注解报红问题及解决
![](https://img.aspxhome.com/file/2023/6/71016_0s.jpg)
linux的shell命令检测某个java程序是否执行
详解Java 信号量Semaphore
![](https://img.aspxhome.com/file/2023/7/69927_0s.png)
详解java中的static关键字
Scala可变参数列表,命名参数和参数缺省详解
Spring Boot web项目的TDD流程
Java多线程下解决数据安全问题
Android实现简单画中画功能
![](https://img.aspxhome.com/file/2023/6/139156_0s.gif)
java读取excel文件的两种方法
![](https://img.aspxhome.com/file/2023/4/87364_0s.png)
详解Android应用开发中Intent的作用及使用方法
Android App页面滑动标题栏颜色渐变详解
android动态壁纸调用的简单实例
Java中对AtomicInteger和int值在多线程下递增操作的测试
C#编程实现获取文件夹中所有文件的文件名
Flutter开发通用页面Loading组件示例详解
Flutter ListView 上拉加载更多下拉刷新功能实现方法
![](https://img.aspxhome.com/file/2023/4/89604_0s.gif)
Android开发注解排列组合出启动任务ksp
![](https://img.aspxhome.com/file/2023/2/139422_0s.jpg)