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() {
        // 清理操作,如关闭数据库连接
}
相关推荐
hnmpf5 分钟前
flask-admin modelview 中重写get_query函数
后端·python·flask
平行线也会相交13 分钟前
云图库平台(三)——后端用户模块开发
数据库·spring boot·mysql·云图库平台
it噩梦20 分钟前
深度分析 es multi_match 中most_fields、best_fields、cross_fields区别
java·elasticsearch
好看资源平台21 分钟前
Java Web开发基础——Web应用的请求与响应机制
java
刘Java24 分钟前
Dubbo 3.x源码(28)—Dubbo服务发布导出源码(7)应用级服务接口元数据发布
java·dubbo·dubbo源码
---wzy---24 分钟前
我的JAVA-Web基础(2)
java·开发语言
小码编匠36 分钟前
WPF 星空效果:创建逼真的宇宙背景
后端·c#·.net
逊嘘37 分钟前
【Java数据结构】LinkedList
java·开发语言·数据结构
总是学不会.38 分钟前
第五篇:前后端如何“扯皮”——HTTP 在开发中的应用
java·网络·网络协议·http·开发
代码拯救不了世界1 小时前
若依框架中的上传图片后如何实现回显到页面的
java·图片上传·若依