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

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注解用于标识一个类是服务层(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();
    }

}

上述代码中,@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;
    }
}

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

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