前言
JSR 250 是 Java Specification Request 的缩写,它定义了一组用于依赖注入和生命周期管理的注解。这些注解是在 Java EE 5 规范中引入的,用于简化和标准化开发企业级应用程序的依赖注入和生命周期管理。
一、开始学习
本次需要学习的依然是注解,本次学习的注解是 @Resource。
@Resource
是 Java EE 规范中定义的注解之一,它用于标记一个成员变量或方法,表示该变量或方法需要依赖注入。@Resource
注解主要有以下几个属性:
name
:指定需要注入的 Bean 的名称。如果不指定,则默认使用成员变量名或方法名作为 Bean 的名称,容器会自动查找对应的 Bean 进行注入。
type
:指定需要注入的 Bean 的类型。如果不指定,则默认使用成员变量或方法的类型作为 Bean 的类型,容器会自动查找对应类型的 Bean 进行注入。
lookup
:指定需要注入的 Bean 的 JNDI 地址。如果指定了该属性,则name
和type
属性将被忽略。
除了以上三个属性,@Resource
还支持 mappedName
属性和 shareable
属性。其中,mappedName
属性用于指定 Bean 的 JNDI 名称,shareable
属性用于指定是否可以在多个线程之间共享 Bean 实例。
需要注意的是,@Resource
注解是 Java EE 规范中定义的注解,如果使用 Spring 等其他框架,建议使用对应框架中提供的注解进行依赖注入。
本次我们主要介绍的是 name 属性的使用。
1、新建项目,结构如下
2、添加 spring 依赖
<!-- spring 的核心依赖 -->
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.23</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.5</version>
</dependency>
<!-- @Resource 需要用到的依赖 -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
注意:@Resource 在 JDK 11 中被移除了,如果要使用需要额外添加依赖,我使用的是 JDK 11,所以需要自己添加依赖使用 @Resource 注解。
3、在 service 包下新建 UserService 接口,在 impl 包下新建 UserServiceImpl 实现类
UserService 接口
public interface UserService {
void save();
}
UserServiceImpl 实现类
@Service("userService")
@Slf4j
public class UserServiceImpl implements UserService {
@Override
public void save() {
log.info("添加用户.....");
}
}
3、在 controller 包下,新建 UserController 类
@Controller
public class UserController {
private UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
/**
* name 指定需要注入的 bean 的 id
*
* @param userService
*/
@Resource(name = "userService")
public void setUserService(UserService userService) {
this.userService = userService;
}
public void add() {
userService.save();
}
}
这是一个使用注解和构造函数进行依赖注入的示例代码。代码中的
UserController
类使用了@Controller
注解来声明一个控制器类,并定义了一个userService
成员变量和一个构造函数。在构造函数中,通过将
UserService
对象作为参数传入构造函数,实现了对userService
的依赖注入。这样,创建UserController
对象时就会自动注入所需的UserService
对象。另外,代码中还使用了
@Resource
注解来标记setUserService()
方法,该方法用于注入userService
对象。通过指定name
属性为 "userService",使得容器可以根据该名称找到对应的UserService
Bean,并将其注入到userService
成员变量中。最后,在
add()
方法中调用了userService
的save()
方法,实现了对userService
的使用。这样,通过注解和构造函数的方式,实现了对
userService
的依赖注入,使得UserController
能够正常使用UserService
的功能。
注意:使用 JSR250(Java 规范提案),它设计了 @Resource 注解来支持依赖注入
spring 对这个注解也实现了支持,需要注意的时这个注解只能用在字段或者 set
方法上,并不支持构造方法注入,默认也是按照类型注入。
4、在 resources 下新建一个 spring 的 xml 文件 application.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 启用包扫描 -->
<context:component-scan base-package="edu.nf.ch09"/>
</beans>
5、测试
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
UserController bean = context.getBean(UserController.class);
bean.add();
}
}
运行结果
二、使用 @Service @Controller @Resource开发有什么好处
使用@Service
、@Controller
、@Resource
等注解开发具有以下好处:
简化配置:通过使用注解,可以减少配置文件的编写,使代码更加简洁。注解能够自动完成配置和装配工作,提高开发效率。
提供声明式事务管理:
@Service
注解表示该类为服务层组件,可以使用声明式事务管理。在需要进行事务管理的方法上,使用@Transactional
注解,就可以实现对方法的事务控制。实现控制反转(IoC)和依赖注入(DI):
@Controller
和@Service
注解都是用来标识组件的,它们作为容器的组件扫描的目标。在Spring容器中,可以使用@Resource
注解将一个对象引用注入到另一个对象中,实现依赖注入。统一管理和组织代码:使用注解可以更好地组织和管理代码,通过注解的方式,可以清晰地标识出不同层次的组件,并且使得代码结构更加清晰。
提高可读性和可维护性:使用注解可以使代码更加直观和易读,通过注解的方式,可以清晰地表达出代码的意图和作用。同时,也方便维护和修改,减少了繁琐的配置。
总体而言,使用@Service
、@Controller
、@Resource
等注解开发可以简化配置、提供声明式事务管理、实现控制反转和依赖注入,统一管理和组织代码,并提高可读性和可维护性。
三、gitee 案例
案例完整地址:https://gitee.com/qiu-feng1/spring-framework.git