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日

相关文章

  • SpringBoot security安全认证登录的实现方法

    下面我将为你详细介绍 SpringBoot security 安全认证登录的实现方法,包括登陆拦截、用户角色授权、自定义登录页面、注销等功能的实现方法。 1. 导入 SpringBoot Security 依赖 在 pom.xml 文件中加入以下依赖: <dependency> <groupId>org.springframework…

    Java 2023年5月20日
    00
  • 基于Spring Security的Oauth2授权实现方法

    下面是详细讲解“基于Spring Security的Oauth2授权实现方法”的完整攻略。 什么是OAuth2 OAuth2是一个授权协议,可以使用户在第三方应用中提供安全的访问API和资源,而无需将用户凭证(例如,用户名和密码)直接提供给第三方应用。 OAuth2的流程通常包括以下步骤: 第三方应用向资源服务器申请访问API的授权; 资源服务器向用户询问授…

    Java 2023年5月20日
    00
  • Apache POI将PPT转换成图片实例代码

    下面就来详细讲解“Apache POI将PPT转换成图片实例代码”的完整攻略。 简介 Apache POI是一个开源的Java库,用于处理Microsoft Office文档格式,如PPT、XLS和DOC等格式。本文将针对PPT格式文件,介绍如何使用Apache POI将PPT转换成图片。 准备工作 在使用Apache POI之前,首先需要进行一些准备工作。…

    Java 2023年5月20日
    00
  • Java获取UTC时间的方法详解

    Java获取UTC时间的方法详解 什么是UTC时间 UTC(Coordinated Universal Time,协调世界时)是一种全球使用的时间标准,与格林威治标准时间(GMT,Greenwich Mean Time)等价。UTC时间是按照原子钟计时的,且与地球自转无关,因此是一种非常精确的时间标准。 Java中获取UTC时间的方法 要在Java中获取UT…

    Java 2023年5月20日
    00
  • Maven项目分析剔除无用jar引用的方法步骤

    Maven是一款非常流行的项目管理工具,它可以帮助我们自动管理项目所需的jar包依赖。但是,当项目依赖的jar包过多时,会导致打包后的文件非常大,同时也会影响项目的运行效率。因此,我们需要对项目进行分析,剔除一些无用的jar包依赖。下面是Maven项目分析剔除无用jar引用的方法步骤的详细介绍: 1. 使用Maven插件dependency:analyze …

    Java 2023年5月19日
    00
  • Java函数式编程(四):在集合中查找元素

    Java函数式编程(四):在集合中查找元素 在Java中,集合是一种非常常用的数据结构。在我们处理集合时,有时候需要从中查找某个元素,这就需要用到一些查找函数。 在这篇文章中,我们将介绍如何使用函数式编程的方式在集合中查找元素。 集合查找函数 在Java 8中,集合提供了一个函数式接口Predicate,用于测试集合中的元素是否符合某个条件。它提供了一个名为…

    Java 2023年5月26日
    00
  • 33基于Java简单实现图书馆借书管理系统设计与实现

    本章节给大家介绍一个基于Java简单实现图书馆借书管理系统的设计与实现 项目概述 项目总体分为俩种角色,分别是管理员和阅读者,管理员可以登录系统中,进行图书管理,上架下架图书,对用户进行管理、对读者进行管理、查看借阅记录管理等,读者角色可以登录系统查询图书信息、借阅和归还图书、查看个人借阅记录、编辑个人信息等。 项目功能简单,数据库也只有4张表,分别为管理员…

    Java 2023年5月8日
    00
  • Linux下PHP+MYSQL+APACHE配置过程 (摘)第1/2页

    针对“Linux下PHP+MYSQL+APACHE配置过程”这一话题,我会提供一个完整的攻略,并在过程中举两个实例说明,内容如下: Linux下PHP+MYSQL+APACHE配置过程 安装apache 在Linux系统下,Apache是一款非常流行的Web服务器软件,可以通过以下步骤进行安装: 更新包管理器 sudo apt update 安装apache…

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