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() {
        // 清理操作,如关闭数据库连接
}
相关推荐
晴子呀11 分钟前
Spring底层原理大致脉络
java·后端·spring
只吹45°风18 分钟前
Java-ArrayList和LinkedList区别
java·arraylist·linkedlist·区别
阿华的代码王国25 分钟前
【JavaEE】多线程编程引入——认识Thread类
java·开发语言·数据结构·mysql·java-ee
黑蛋同志26 分钟前
array和linked list的区别
java
andrew_121932 分钟前
腾讯 IEG 游戏前沿技术 一面复盘
java·redis·sql·面试
andrew_121934 分钟前
腾讯 IEG 游戏前沿技术 二面复盘
后端·sql·面试
寻求出路的程序媛39 分钟前
JVM —— 类加载器的分类,双亲委派机制
java·jvm·面试
计算机程序设计开发40 分钟前
计算机毕业设计公交站点线路查询网站登录注册搜索站点线路车次/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序
数据库·vue.js·spring boot·课程设计·计算机毕业设计
这孩子叫逆41 分钟前
35. MyBatis中的缓存失效机制是如何工作的?
java·spring·mybatis
骆晨学长42 分钟前
基于SpringBoot的校园失物招领系统
java·spring boot