SpringBoot加载Bean的八种方式总结
在使用SpringBoot时,我们常常需要加载Bean来完成各种任务。SpringBoot提供了多种方式来加载Bean,本文将对其进行总结。
1. 使用@ComponentScan
自动扫描注解
@ComponentScan
是Spring框架中常用的注解,它会自动扫描指定的包及其子包,将所有标记有@Component
、@Service
、@Repository
、@Controller
等注解的类自动装配到Spring上下文中。示例代码如下:
@SpringBootApplication
@ComponentScan(basePackages = "com.example.demo")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2. 使用@Configuration
和@Bean
手动添加Bean
通过@Configuration
和@Bean
注解,我们可以手动向Spring上下文中添加Bean。示例代码如下:
@Configuration
public class MyConfig {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
}
3. 使用@Import
导入配置类
使用@Import
注解可以将一个或多个@Configuration配置类导入到当前配置类中,这些被导入的配置类中的Bean将被装入到Spring上下文中。示例代码如下:
@Configuration
@Import(MyAnotherConfig.class)
public class MyConfig {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
}
@Configuration
public class MyAnotherConfig {
@Bean
public UserDao userDao() {
return new UserDaoImpl();
}
}
4. 使用@ImportResource
导入XML配置文件
如果你使用了XML配置文件,可以通过@ImportResource
注解导入XML配置文件中定义的Bean。示例代码如下:
@Configuration
@ImportResource("classpath:applicationContext.xml")
public class MyConfig {
@Autowired
private UserDao userDao;
}
5. 使用@Conditional
根据条件添加Bean
通过@Conditional
注解,我们可以指定一些条件,当满足这些条件时,才会向Spring上下文中添加Bean。示例代码如下:
@Configuration
public class MyConfig {
//当类路径上存在com.mysql.jdbc.Driver时,才添加DataSource Bean
@Conditional(OnClassCondition.class)
@Bean
public DataSource dataSource() {
return DataSourceBuilder.create()
.url("jdbc:mysql://localhost/mydb")
.username("root")
.password("root")
.driverClassName("com.mysql.jdbc.Driver")
.build();
}
}
public class OnClassCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
try {
Class.forName("com.mysql.jdbc.Driver");
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
}
6. 使用@Profile
指定不同环境下的Bean
通过@Profile
注解,我们可以指定在不同的环境下,加载不同的Bean。示例代码如下:
@Configuration
public class MyConfig {
@Bean
@Profile("dev")
public DataSource devDataSource() {
return DataSourceBuilder.create()
.url("jdbc:mysql://localhost/mydb_dev")
.username("root")
.password("root")
.driverClassName("com.mysql.jdbc.Driver")
.build();
}
@Bean
@Profile("prod")
public DataSource prodDataSource() {
return DataSourceBuilder.create()
.url("jdbc:mysql://localhost/mydb_prod")
.username("root")
.password("root")
.driverClassName("com.mysql.jdbc.Driver")
.build();
}
}
7. 使用SpringFactoriesLoader扫描特定包并装载Bean
SpringFactoriesLoader是Spring Framework 4.x提供的一个工具类,可以通过读取classpath下所有的META-INF/spring.factories
文件,加载配置中指定的Bean。示例代码如下:
@Service
public class MyService {
public void init() {
System.out.println("MyService init...");
}
}
public class MyInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
Set<String> packagesToScan = SpringFactoriesLoader
.loadFactoryNames(ApplicationContextInitializer.class, MyInitializer.class.getClassLoader());
for (String packageName : packagesToScan) {
Reflections reflections = new Reflections(packageName);
Set<Class<? extends MyService>> services = reflections.getSubTypesOf(MyService.class);
for (Class<? extends MyService> service : services) {
try {
applicationContext.getBeanFactory().registerSingleton(service.getName(),
service.getDeclaredConstructor().newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(DemoApplication.class);
app.addInitializers(new MyInitializer());
app.run(args);
}
}
8. 使用FactoryBean手动配置Bean
通过实现org.springframework.beans.factory.FactoryBean
接口,我们可以手动配置一个Bean,这样可以保存更多的自定义实例化逻辑。示例代码如下:
public class MyServiceFactory implements FactoryBean<MyService> {
@Override
public MyService getObject() {
MyService myService = new MyService();
//定义 more complex initialization logic here...
return myService;
}
@Override
public Class<?> getObjectType() {
return MyService.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
@Configuration
public class MyConfig {
@Bean
public MyServiceFactory myServiceFactory() {
return new MyServiceFactory();
}
@Bean
public MyService myService() throws Exception {
return myServiceFactory().getObject();
}
}
结束语:以上就是SpringBoot加载Bean的八种方式,你可以根据实际需求选择适合自己的方式来加载Bean。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot加载bean的八种方式总结 - Python技术站