Java Spring 框架技术从入门到放弃:Spring生态之Spring 中 Annotation 自动装配,Spring 常用注解及应用

Java Spring 框架技术从入门到放弃:Spring生态之Spring 中 Annotation 自动装配学习笔记

一、核心概念与生活案例

概念

Spring 的 Annotation 自动装配是利用注解来自动完成 Bean 的依赖注入,无需在 XML 中进行大量繁琐的配置,极大地简化了开发流程。

生活案例

想象一家餐厅,餐厅里有厨师、服务员、收银员等角色(相当于 Bean)。老板(Spring 容器)通过查看员工的技能标签(注解),自动将合适的员工安排到对应的岗位(依赖注入),而不需要老板一个个手动去安排。

二、常用注解及应用

1. @Component 及其衍生注解(重点)

概念

@Component 是一个通用的注解,用于将类标记为 Spring 管理的 Bean。它有三个常用的衍生注解:@Service@Repository 和 @Controller,它们在语义上有更明确的分工。

  • @Service:通常用于标记业务逻辑层的类。
  • @Repository:用于标记数据访问层的类,如 DAO 类。
  • @Controller:用于标记控制器层的类,处理 HTTP 请求。
案例

在餐厅中,@Service 就像是餐厅的厨师长,负责管理和安排菜品的制作流程(业务逻辑);@Repository 如同餐厅的食材仓库管理员,负责食材的存储和取用(数据访问);@Controller 则是餐厅的服务员,接收顾客的订单(HTTP 请求)并将其传递给厨师长。

代码示例
// 业务逻辑层
@Service
public class RestaurantService {
    // 业务逻辑方法
}

// 数据访问层
@Repository
public class DishRepository {
    // 数据访问方法
}

// 控制器层
@Controller
public class RestaurantController {
    // 处理请求的方法
}

2. @Autowired(重点)

概念

@Autowired 用于自动注入依赖的 Bean。Spring 会根据类型在容器中查找匹配的 Bean 并注入。

案例

在餐厅里,厨师长(RestaurantService)需要使用各种厨具(DishRepository)来制作菜品。通过 @Autowired,老板(Spring 容器)会自动将合适的厨具(Bean)提供给厨师长。

代码示例
@Service
public class RestaurantService {
    @Autowired
    private DishRepository dishRepository;

    // 使用 dishRepository 进行业务操作
}

3. @Qualifier

概念

当存在多个同类型的 Bean 时,@Autowired 无法确定注入哪个 Bean,此时可以使用 @Qualifier 来指定具体要注入的 Bean 的名称。

案例

餐厅里有多种不同品牌的烤箱(同类型的 Bean),厨师长(RestaurantService)需要指定使用某个特定品牌的烤箱(通过 @Qualifier 指定 Bean 名称)来制作特定的菜品。

代码示例
@Service
public class RestaurantService {
    @Autowired
    @Qualifier("specificOven")
    private Oven oven;

    // 使用指定的 oven 进行业务操作
}

4. @Resource

概念

@Resource 是 JSR-250 标准的注解,它可以根据名称或类型进行注入。默认先根据名称查找,如果找不到再根据类型查找。

案例

在餐厅中,服务员(RestaurantController)需要使用特定的菜单(Bean)来为顾客提供服务。@Resource 可以帮助服务员准确地找到所需的菜单。

代码示例
@Controller
public class RestaurantController {
    @Resource(name = "specialMenu")
    private Menu menu;

    // 使用 menu 处理请求
}

5. @Value

概念

@Value 用于注入外部配置文件中的值,如属性文件(.properties)或 YAML 文件中的值。

案例

餐厅的营业时间是一个配置项,存储在外部配置文件中。服务员(RestaurantController)可以通过 @Value 获取这个营业时间,并告知顾客。

代码示例
@Controller
public class RestaurantController {
    @Value("${restaurant.openTime}")
    private String openTime;

    // 使用 openTime 处理请求
}

三、最佳实践与注意事项

最佳实践

  • 优先使用构造器注入:使用构造器注入可以确保依赖的不可变性和完整性,避免空指针异常。
@Service
public class RestaurantService {
    private final DishRepository dishRepository;

    @Autowired
    public RestaurantService(DishRepository dishRepository) {
        this.dishRepository = dishRepository;
    }
}
  • 合理使用注解:根据类的职责选择合适的注解,如 @Service@Repository 和 @Controller,提高代码的可读性和可维护性。

注意事项

  • 循环依赖问题:当两个或多个 Bean 之间存在循环依赖时,可能会导致 Spring 容器启动失败。可以通过 @Lazy 注解来解决部分循环依赖问题。
  • 多个同类型 Bean 问题:当存在多个同类型的 Bean 时,需要使用 @Qualifier 或 @Primary 注解来明确指定要注入的 Bean。

四、预习后续知识

1. Spring Boot 自动配置

Spring Boot 基于 Spring 的 Annotation 自动装配,提供了更强大的自动配置功能。学习 Spring Boot 的自动配置原理和使用方法,可以进一步简化开发流程。

2. Spring AOP 与注解

了解如何结合 Annotation 实现面向切面编程(AOP),如使用 @Aspect@Before@After 等注解来实现日志记录、事务管理等功能。

3. Spring Security 注解

学习 Spring Security 中使用的注解,如 @PreAuthorize@PostAuthorize 等,用于实现基于注解的权限控制。

4. Spring Data JPA 注解

掌握 Spring Data JPA 中使用的注解,如 @Entity@Id@GeneratedValue 等,用于简化数据库操作。

通过掌握 Spring 中 Annotation 自动装配的知识,可以提高开发效率,使代码更加简洁和易于维护。同时,为后续学习 Spring Boot、AOP、Security 等高级知识打下坚实的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zl515035644

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值