在Spring Boot中,Bean的构建方式主要有以下几种:

1. 使用@Component注解及其衍生注解构建Bean

  • 原理
    • Spring Boot会自动扫描被这些注解标记的类,并将其注册为Bean。衍生注解包括@Service(用于标记业务逻辑层组件)、@Repository(用于标记数据访问层组件)、@Controller(用于标记控制层组件,在Spring MVC中使用)。
  • 示例
import org.springframework.stereotype.Component;

@Component
public class MyComponent {
    // 组件的业务逻辑
}

如果是业务逻辑层,可以使用@Service

import org.springframework.stereotype.Service;

@Service
public class MyService {
    // 业务逻辑
}

数据访问层使用@Repository

import org.springframework.stereotype.Repository;

@Repository
public class MyRepository {
    // 数据访问逻辑
}

2. 使用@Bean注解在配置类中构建Bean

  • 原理
    • 在一个被@Configuration注解标记的配置类中,可以使用@Bean注解来定义一个方法,该方法返回的对象会被注册为Bean。
  • 示例
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

这里myBean方法返回的MyBean对象会被注册为Spring容器中的一个Bean。

3. 通过自动配置构建Bean

  • 原理
    • Spring Boot提供了大量的自动配置类,这些自动配置类会根据类路径下的依赖和配置信息自动创建和配置相关的Bean。例如,当在项目中引入spring-boot-starter-web依赖时,Spring Boot会自动配置TomcatDispatcherServlet等相关Bean。
  • 示例
    • 当引入spring-boot-starter-data-jpa依赖时,Spring Boot会自动配置EntityManagerFactoryJpaTransactionManager等相关Bean,开发人员可以直接在代码中使用这些自动配置好的Bean。

4. 使用@Import注解导入其他配置类或组件来构建Bean

  • 原理
    • @Import注解可以用于在一个配置类中导入其他配置类、接口或组件类,从而将被导入的类中的Bean定义也纳入到当前Spring容器的管理中。
  • 示例
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(OtherConfig.class)
public class AppConfig {
    // 自身的Bean定义可以在这里继续添加
}

这里AppConfig通过@Import导入了OtherConfigOtherConfig中的Bean定义也会被注册。

5. 通过条件注解构建Bean

  • 原理
    • Spring Boot提供了一系列条件注解,如@ConditionalOnClass@ConditionalOnMissingClass@ConditionalOnProperty等。这些注解可以根据类是否存在、属性是否满足条件等来决定是否创建某个Bean。
  • 示例
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnClass(SomeClass.class)
public class ConditionalConfig {
    @Bean
    public MyConditionalBean myConditionalBean() {
        return new MyConditionalBean();
    }
}

这里只有当SomeClass存在于类路径下时,MyConditionalBean才会被创建。

10-17 18:19