SpringBoot加载bean的八种方式总结

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技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java中使用LocalDate根据日期来计算年龄的实现方法

    以下是详细的“Java中使用LocalDate根据日期来计算年龄的实现方法”的攻略: 1. 概述 Java 8中的java.time包提供了一个强大的日期和时间API。在Java 8中,可以使用LocalDate类来表示一个日期,该类提供了许多方法来计算年龄。可以使用LocalDate的静态方法来计算年龄。在本攻略中,我们将提供两个示例,来演示如何使用Loc…

    Java 2023年5月20日
    00
  • Java8 日期、时间操作代码

    Java8引入了新的时间日期API,该API提供了更好的日期时间处理方式,包括易于格式化和解析日期时间、更好的时区支持和可扩展性,下面是Java 8日期和时间操作的完整攻略: 获取当前日期和时间 通过使用Java 8日期API,我们可以轻松地获取当前日期和时间。以下是获取当前日期和时间的代码示例: LocalDateTime now = LocalDateT…

    Java 2023年5月20日
    00
  • Security框架:如何使用CorsFilter解决前端跨域请求问题

    当前端发送请求到后端时,如果请求的域名与后端的域名不一致,就会出现跨域行为。为了确保网站的安全性,浏览器默认不允许跨域请求。这就需要开发者采用跨域方案让浏览器通过。 在Spring Security框架中,使用CorsFilter组件来解决前端跨域请求问题。其中,CorsFilter是 Spring Security 框架自带的跨域请求解决方案,它在返回的响…

    Java 2023年5月20日
    00
  • Springboot – Fat Jar示例详解

    Springboot – Fat Jar示例详解 什么是Fat Jar Fat Jar是指将程序所依赖的所有库和资源全部打包到一个Jar文件中。使用Fat Jar可以简化部署流程和环境配置过程,也可以避免因依赖库版本不一致造成的问题。 如何构建Fat Jar Spring Boot提供了插件来构建Fat Jar。我们可以在pom.xml文件中添加以下配置: …

    Java 2023年6月2日
    00
  • Java实现创建运行时类的对象操作示例

    创建运行时类的对象是一个非常常见且必须的操作,下面我将为您提供实现此操作的详细攻略,包括Java中的示例代码。 1. 了解Class类 在 Java 语言中,每一个类都会对应一个 Class 类的实例,这个实例包含了有关该类的信息,我们可以通过这个实例对该类进行操作。因此,了解 Class 类是实现创建运行时类的对象的第一步。 我们可以使用以下三种方式来获取…

    Java 2023年5月26日
    00
  • SpringBoot整合mybatis简单案例过程解析

    下面是Spring Boot整合MyBatis的攻略过程,包含两条示例: 一、创建Spring Boot项目 首先,我们需要创建一个Spring Boot项目,可以使用IDEA直接创建,也可以使用Spring Initializr创建。 使用Spring Initializr创建项目时,需要勾选Web、MyBatis和MySQL等必要的依赖。创建完成后,项目…

    Java 2023年5月20日
    00
  • Java中Arrays的介绍及使用方法示例

    Java中Arrays的介绍及使用方法示例 1. 什么是Arrays 在Java编程语言中,Arrays是一个类,用来操作数组的工具类,包含了一些静态方法,如排序和二分查找等。 2. Arrays的常用方法 2.1 初始化数组 Arrays类提供的最常用的初始化数组的方法是:Arrays.fill(),可以用来填充一个数组。 // 初始化长度为10的数组,全…

    Java 2023年5月26日
    00
  • JAVA对象和字节数组互转操作

    Java对象和字节数组互转操作是Java编程中常见的技巧之一。在某些情况下,我们需要把Java对象序列化成字节数组,再把字节数组反序列化为Java对象,这样可以在网络传输、文件存储等场景中实现数据的传输和存储。本文以Java 8为例,讲解Java对象和字节数组互转的完整攻略。 1. Java对象转字节数组 Java对象转字节数组需要使用到Java的序列化机制…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部