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 2023年5月12日
    00
  • 关于java的九个预定义Class对象

    关于Java的九个预定义Class对象,包括以下内容: Object类:是类层次结构的根类,所有类都直接或间接地继承自Object类。Object类提供了基本的方法,如equals()、hashCode()、toString()等。 String类:用于表示字符串,是Java中最常用的类之一。String类是不可变的,意味着一旦创建,就不能修改它的值。 St…

    Java 2023年5月26日
    00
  • JavaWeb开发入门第二篇Tomcat服务器配置讲解

    下面是对”JavaWeb开发入门第二篇Tomcat服务器配置讲解”的完整攻略: 1. 下载Tomcat服务器 首先需要到Tomcat的官网(https://tomcat.apache.org/)下载对应的版本,选择”Download”页面中的合适版本即可。下载完成后,解压到本地即可。 2. 配置环境变量 在操作系统中配置Tomcat服务器的环境变量可以让我们…

    Java 2023年5月20日
    00
  • Springboot内嵌tomcat应用原理深入分析

    Spring Boot是现今最流行的Java Web框架之一,其最大的优点是使用内嵌的Tomcat容器,降低了Web应用的开发和部署成本。本文将深入分析Spring Boot内嵌Tomcat应用的原理,并介绍两个示例。 1. Spring Boot内嵌Tomcat原理 Spring Boot应用的内嵌Tomcat配置在pom.xml文件中的依赖中引入了Tom…

    Java 2023年5月19日
    00
  • 详解CentOS7.0安装与配置Tomcat-7

    下面是详解CentOS7.0安装与配置Tomcat-7的完整攻略: 安装Java 使用yum安装Java: sudo yum install java 验证Java是否安装成功: java -version 下载与安装Tomcat 下载Tomcat7: wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-7…

    Java 2023年5月19日
    00
  • Java的基本数据类型和运算方法(必看篇)

    Java的基本数据类型和运算方法(必看篇) Java中的基本数据类型包括八种:byte、short、int、long、float、double、char、boolean。 整型 主要包括 byte、short、int、long 四种类型。其中 byte 类型占用 1 个字节,取值范围为 -128 到 127;short 类型占用 2 个字节,取值范围为 -3…

    Java 2023年5月20日
    00
  • SpringMvc接收参数方法总结(必看篇)

    下面是SpringMVC接收参数方法总结的完整攻略。该攻略旨在介绍SpringMVC中五种常见的接收参数的方法,包括: 接收URL路径中的参数PathVariable 接收请求参数RequestParam 接收JSON参数RequestBody 接收表单参数ModelAttribute 接收文件参数RequestParam 下面我们来详细说明每种方法。 接收…

    Java 2023年6月15日
    00
  • Spring Boot ActiveMQ如何设置访问密码

    下面是详细讲解 Spring Boot ActiveMQ 如何设置访问密码的攻略: 1. 安装 ActiveMQ 首先需要安装 ActiveMQ。可以从官网下载二进制包,然后进行解压。假设解压后的目录为 activemq。 2. 配置 ActiveMQ 访问账号和密码 2.1 访问控制文件 在 ActiveMQ 的安装目录下,找到 conf 目录中的 act…

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