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() {
        // 清理操作,如关闭数据库连接
}
相关推荐
monkey_meng2 分钟前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
天天进步20153 分钟前
Vue+Springboot用Websocket实现协同编辑
vue.js·spring boot·websocket
草莓base14 分钟前
【手写一个spring】spring源码的简单实现--bean对象的创建
java·spring·rpc
Estar.Lee17 分钟前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
drebander39 分钟前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
乌啼霜满天24942 分钟前
Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
java·spring boot·spring·mvc
tangliang_cn1 小时前
java入门 自定义springboot starter
java·开发语言·spring boot
程序猿阿伟1 小时前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
Grey_fantasy1 小时前
高级编程之结构化代码
java·spring boot·spring cloud
新知图书1 小时前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust