在 Spring Boot 应用开发中,Bean 的管理是核心功能之一。Spring Boot 提供了一套强大的注解系统,帮助开发者轻松管理 Bean 的生命周期和依赖注入。本文将深入探讨 Spring Boot 中常用的 Bean 处理注解及其应用场景。
一、@Component注解
@Component是一个基础的注解,用于标识一个类为 Spring 容器管理的 bean。当一个类被标注为@Component时,Spring容器会在启动时自动扫描并实例化这个类,将其纳入容器的管理范围。如,
@Compnent
public class FeignWrapper{}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
// 该注解就会自动扫描@component注解标识的FeignWrapper类
public @interface SpringBootApplication {}
二、@Service、@Repository和@Controller
这三个注解都是@Component的特定化版本,分别用于表示服务层、数据访问层和控制层的类。如,
@Service
public class UserServiceImpl{}
@Repository
// 通过继承 Spring Data 的 Repository 接口来获得一些常用的数据访问方法,如findById、save、deleteById等。
public class UserRepository extends JpaRepository<User, Long>{}
@Mapper
public class UserMapper extends BaseMapper<User>{}
@Controller
public class UserController{}
值得注意的是,@Controller标准的类会直接返回视图,目前微服务项目中,基本都使用@RestController, 具体细节可查看Spring Boot 注解探秘:HTTP 请求的魅力之旅。
同时@Repository和@Mapper都用于标识数据访问层的类,但是在微服务的项目中,@Mapper使用更加频繁。
三、@Autowired
@Autowired注解用于根据类型自动注入bean。
这里还要提到@Resource,它是优先根据名称来注入bean,根据名称找不到之后,则根据类型进行匹配。如,
@Service
public class UserAggregate{
// 方式1
@Autowired
private UserService userService;
// 方式2
@Resource(name ="userServcieImpl")
private UserService userService;
}```
# 四、@Qualifier
当存在多个相同类型的bean时,可以使用@Qualifier注解来指定具体要注入的bean,如
```java
@Service
public class UserAggregate{
// 方式1
@Autowired
@Qualifier(userServcieImpl)
private UserService userService;
}
五、@Configuration和@Bean
@Configuration用于标识一个类为配置类,@Bean注解用于在配置类中定义 bean。示例可参考Eureka系列:
- 探究 Eureka 在 Spring Boot 中的配置注入与统一管理机制(中)
- 探究 Eureka 在 Spring Boot 中的配置注入与统一管理机制(下)——第一节
- 探究 Eureka 在 Spring Boot 中的配置注入与统一管理机制(下)——第二节
- 探究 Eureka 在 Spring Boot 中的配置注入与统一管理机制(下)——第三节
- 探究 Eureka 在 Spring Boot 中的配置注入与统一管理机制(下)——第四节
- 探究 Eureka 在 Spring Boot 中的配置注入与统一管理机制(下)——第五节
六、@Scope
@Scope注解用于定义 bean 的作用域,控制 bean 的生命周期和实例化方式。常见的作用域有 singleton、prototype、request、session 等。
1. singleton作用域
在整个 Spring 容器的生命周期中,单例 bean 只会被创建一次。无论有多少个地方请求这个 bean,始终返回同一个实例。
适用于配置读取类,日志记录类,工具类等场景。
2. prototype作用域
每次请求原型 bean 时都会创建一个新的实例。不同的请求之间不会共享同一个实例。
适用于多数据源场景。
3. request作用域
当一个 HTTP 请求进入时,Spring 容器会根据需要创建一个请求作用域的 bean 实例,并在请求处理过程中使用这个实例。当请求处理完成后,该实例通常会被销毁。销毁方法见第七节。
适用于在Web中存储用户的请求状态,如可以将用户的请求参数、认证信息等存储在一个请求作用域的 bean 中,以便在整个请求处理过程中使用。
4. session作用域
同3,同样适用于Web应用,如用户的购物车信息、登录状态等可以存储在会话作用域的 bean 中,以便在用户的整个会话过程中保持一致。
七、@PostConstruct 和 @PreDestroy
@PostConstruct和@PreDestroy注解通常与 Spring 管理的 bean 一起使用。Spring 容器会在 bean 实例化完成后自动调用被@PostConstruct注解标记的方法,并在 bean 即将被销毁之前自动调用被@PreDestroy注解标记的方法。
@Service
public class UserServiceImpl {
@PostConstruct
public void init() {
// 加载用户数据的初始化操作
}
@PreDestroy
public void destroy() {
// 清理操作,如关闭数据库连接
}