• Spring Boot中如何实现bean加载


    在Spring Boot中,bean的加载是通过Spring框架的IoC(Inversion of Control)容器实现的。IoC容器负责管理bean的生命周期,并在需要的时候进行加载、实例化、依赖注入和销毁等操作。

    Spring Boot使用的是Spring框架的核心模块Spring IoC,其工作原理如下:
    1.扫描@Component注解:Spring Boot会自动扫描指定包及其子包下所有的类,查找带有@Component注解的类,并将其注册为bean。@Component注解是Spring框架的通用注解,用于标识一个类是一个组件。
    2.注解驱动的bean定义:除了@Component注解,Spring Boot还支持其他注解,如@Service、@Repository、@Controller等,它们分别用于标识不同类型的组件。这些注解会被Spring Boot扫描到,并根据其类型进行特定的处理。
    3.自动配置:Spring Boot会根据classpath下的配置信息,自动进行bean的配置和装配。它会根据约定大于配置的原则,根据类路径下的依赖和配置文件,为bean提供默认的配置信息。例如,Spring Boot会根据classpath下的application.properties或application.yml文件,自动配置DataSource、JPA等常用的bean。
    4.条件化加载:Spring Boot还支持条件化加载bean,即根据特定的条件来判断是否加载某个bean。可以使用@Conditional注解来标识一个bean,并通过编写自定义的条件类来决定是否加载该bean。
    5.手动注册bean:除了自动扫描和自动配置外,还可以通过编写配置类,手动注册bean。这可以通过在配置类中使用@Configuration注解,并在方法上使用@Bean注解来实现。

    总结:Spring Boot使用Spring框架的IoC容器来实现bean的加载。它通过自动扫描注解、自动配置、条件化加载和手动注册等方式,实现bean的装配和管理。这样可以大大简化开发者的工作,提高开发效率。

    下面是对五种方式的一些讲解和对比

    @Service和@Repository是Spring框架中的两个常用注解,用于标识不同层次的组件。
    @Service注解用于标识一个类是服务层(Service)的组件,表示该类中包含了业务逻辑的实现。
    @Service注解通常用于在表示业务逻辑的类上,用于处理业务逻辑的调用、事务管理等。
    被@Service注解标识的类会被Spring容器自动扫描并注册为bean,以便在其他组件中进行依赖注入。
    @Repository注解用于标识一个类是数据访问层(DAO)的组件,表示该类用于访问数据库或其他数据源。
    @Repository注解通常用于表示数据访问层的类上,用于执行数据库操作、查询等。
    被@Repository注解标识的类也会被Spring容器自动扫描并注册为bean,以便在其他组件中进行依赖注入。

    总结:

    @Service注解用于标识业务逻辑层的组件,包含业务逻辑的实现。
    @Repository注解用于标识数据访问层的组件,用于访问数据库或其他数据源。
    两者都会被Spring容器自动扫描并注册为bean,以便在其他组件中进行依赖注入。

    以下是一个使用@Conditional注解条件化加载bean的示例代码:

    
    ```java
    @Configuration
    public class AppConfig {
        @Bean
        @Conditional(EnvironmentCondition.class)
        public DataSource dataSource() {
            // 创建适合开发环境的DataSource
            return new DevDataSource();
        }
    
        @Bean
        @Conditional(EnvironmentCondition.class)
        public DataSource dataSourcemysql() {
            // 创建适合测试环境的DataSource
            return new TestDataSource();
        }
    
        @Bean
        @Conditional(EnvironmentCondition.class)
        public DataSource dataSourceoracle() {
            // 创建适合生产环境的DataSource
            return new ProdDataSource();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    上述代码中,@Configuration注解表示该类是一个配置类,@Bean注解表示创建一个bean对象。在这里,我们使用@Conditional(EnvironmentCondition.class)注解来设置条件,即只有在EnvironmentCondition类中的条件满足时,才会创建对应的bean。

    下面是EnvironmentCondition类的代码:

    public class EnvironmentCondition implements Condition {
    
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            String environment = context.getEnvironment().getProperty("spring.profiles.active");
            if (environment != null && environment.equals("development")) {
                return true;    // 当前环境是开发环境,条件满足
            }
            return false;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在EnvironmentCondition类中,我们实现了Condition接口,并重写了matches()方法。在matches()方法中,我们通过ConditionContext对象获取当前环境的属性值,并进行判断。如果满足条件,返回true,表示条件满足,对应的bean将被创建;否则返回false,对应的bean不会被创建。

    以上示例中,根据当前环境的属性值来创建不同的DataSource对象,可以根据具体环境的不同来创建适合该环境的bean对象。

  • 相关阅读:
    信号量机制类型:整型和记录型
    洛谷题解 | P1051 谁拿了最多奖学金
    C++ 通过 #include 了解 Compiler 和 Linker
    css3 都有哪些新属性
    AI时代项目经理与架构师的成长之道:ChatGPT让你插上翅膀
    北京何氏眼科专家:缓解眼干涩,为眼睛“加油”很重要!
    软件测试基本原则
    Haproxy集群调度器与部署
    支持十亿级密态数据、低代码,蚂蚁集团发布隐语开放平台
    Spring 学习总结(35)—— Spring 6.0 新特性总结
  • 原文地址:https://blog.csdn.net/qq_40121580/article/details/133299842