Spring Boot 注解探秘:Bean 管理的艺术

在 Spring Boot 应用开发中,Bean 的管理是核心功能之一。Spring Boot 提供了一套强大的注解系统,帮助开发者轻松管理 Bean 的生命周期和依赖注入。本文将深入探讨 Spring Boot 中常用的 Bean 处理注解及其应用场景。

一、@Component注解

@Component是一个基础的注解,用于标识一个类为 Spring 容器管理的 bean。当一个类被标注为@Component时,Spring容器会在启动时自动扫描并实例化这个类,将其纳入容器的管理范围。如,

java 复制代码
@Compnent
public class FeignWrapper{}
java 复制代码
@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的特定化版本,分别用于表示服务层、数据访问层和控制层的类。如,

java 复制代码
@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,根据名称找不到之后,则根据类型进行匹配。如,

java 复制代码
@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系列:

六、@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注解标记的方法。

java 复制代码
@Service
public class UserServiceImpl {

    @PostConstruct
    public void init() {
        // 加载用户数据的初始化操作
    }

	@PreDestroy
    public void destroy() {
        // 清理操作,如关闭数据库连接
}
相关推荐
考琪10 分钟前
Nginx打印变量到log方法
java·运维·nginx
wangjialelele20 分钟前
Linux中的进程管理
java·linux·服务器·c语言·c++·个人开发
历程里程碑21 分钟前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
李日灐26 分钟前
C++进阶必备:红黑树从 0 到 1: 手撕底层,带你搞懂平衡二叉树的平衡逻辑与黑高检验
开发语言·数据结构·c++·后端·面试·红黑树·自平衡二叉搜索树
晔子yy31 分钟前
如何设计让你的程序同时处理10w条数据
java
Yvonne爱编码37 分钟前
链表高频 6 题精讲 | 从入门到熟练掌握链表操作
java·数据结构·链表
lpfasd12341 分钟前
物联网后端岗位java面试题
java·物联网·php
毕设源码李师姐43 分钟前
计算机毕设 java 基于 java 的图书馆借阅系统 智能图书馆借阅综合管理平台 基于 Java 的图书借阅与信息管理系统
java·开发语言·课程设计
忆~遂愿43 分钟前
Runtime 上下文管理:计算实例的生命周期、延迟最小化与上下文切换优化
java·大数据·开发语言·人工智能·docker
powerfulhell1 小时前
寒假python作业5
java·前端·python