@Resource和@Autowired

在Spring框架中,@Resource@Autowired都是用于依赖注入的注解,但它们有一些重要的区别:

1. 来源和标准

  • @Resource:这是Java标准注解(JSR-250),属于javax.annotation包。它不依赖于任何特定框架,是Java EE标准的一部分,因此具有更好的通用性。
  • @Autowired:这是Spring框架特有的注解,属于org.springframework.beans.factory.annotation包。

2. 注入方式

  • @Resource:默认按名称注入。它首先根据属性名或指定的name属性查找匹配的Bean,如果找不到,则按类型注入。
  • @Autowired:默认按类型注入。它根据属性的类型在Spring容器中查找匹配的Bean。

3. 使用方式

// @Resource的使用方式
@Resource
private IUserService userService; // 按名称"userService"查找
 
@Resource(name = "specificUserService")
private IUserService userService; // 按指定名称查找
 
// @Autowired的使用方式
@Autowired
private IUserService userService; // 按类型查找
 
@Autowired
@Qualifier("specificUserService")
private IUserService userService; // 按类型查找后用Qualifier指定名称

4. 为什么在这个项目中使用@Resource?

  1. 标准化@Resource是Java标准注解,不依赖于特定框架,提高了代码的可移植性。
  2. 清晰性:按名称注入的策略更直观,特别是在有多个实现类的情况下,更容易理解和维护。
  3. 兼容性:如果项目需要在不同的框架间切换,使用标准注解可以减少迁移成本。

5. 项目中的实际应用

在你的项目中,可以看到多处使用了@Resource

@RestController
@RequestMapping("/user")
public class UserController {
 
    @Resource
    private IUserService userService;
 
    @Resource
    private IUserInfoService userInfoService;
    
    // ...
}

这里使用@Resource按照字段名称(userService, userInfoService)注入相应的服务实现,这种方式清晰直观。

总的来说,虽然@Autowired在Spring项目中更为常见,但@Resource作为一种标准注解,在某些场景下具有更好的通用性和清晰性。选择哪个注解主要取决于项目需求、团队规范和对框架依赖的考量。

@PostConstruct

@PostConstruct 注解用于标记一个方法,该方法需要在依赖注入完成后执行 。这个方法会在对象创建并完成依赖注入后自动调用 。

虽然它常在Spring框架中使用,但@PostConstruct实际上是Java EE 5引入的注解 ,属于javax.annotation包 ,并非Spring框架本身提供 。Spring支持此注解 。

它的主要作用是在Bean初始化完成后执行特定的初始化操作 ,例如:

  • 设置初始值或初始状态 。
  • 启动定时任务或后台进程 。
  • 执行那些依赖于依赖注入完成的初始化操作,而这些操作无法在构造函数中实现 。

该方法必须在类被投入服务(即完全初始化并可用)之前调用 。可以理解为在Spring容器初始化Bean的时候执行该方法 。