Spring(17)——对JSR330标准的支持

简介: 17 对JSR330标准注解的支持 除了使用Spring标准的注解来定义bean、定义bean之间的依赖关系外,Spring还支持使用JSR330标准的注解来进行相关的定义,主要是对@Inject和@Named两个注解的支持。

17 对JSR330标准注解的支持

除了使用Spring标准的注解来定义bean、定义bean之间的依赖关系外,Spring还支持使用JSR330标准的注解来进行相关的定义,主要是对@Inject和@Named两个注解的支持。

要使用JSR330标准的注解进行对应的bean定义,我们首先需要将JSR330标准对应的jar包加入我们的classpath。笔者习惯使用Maven来管理相应的依赖,所以笔者只需要在项目的pom.xml文件中加入如下依赖项即可。

<dependency>
	<groupId>javax.inject</groupId>
	<artifactId>javax.inject</artifactId>
	<version>1</version>
</dependency>

17.1 @Inject

@Inject注解的功能相当于Spring标准中的@Autowired注解的功能。其是用来定义自动注入的,而且与@Autowired一样,@Inject可以标注在field、method或constructor上。

1、标注在field上

public class Hello {
	
	@Inject
	private World world;
	
}

2、标注在method上

public class Hello {
	
	private World world;
	
	@Inject
	public void doSomething(World world) {
		this.world = world;
	}

}

对于方法注入的情况也可以通过一个方法同时注入多个bean,具体如下所示。

public class Hello {
	
	private World world;
	private BeanA beanA;
	
	@Inject
	public void doSomething(World world, BeanA beanA) {
		this.world = world;
		this.beanA = beanA;
	}

}

3、标注在constructor上

public class Hello {
	
	private World world;
	private BeanA beanA;
	
	@Inject
	public Hello(World world, BeanA beanA) {
		this.world = world;
		this.beanA = beanA;
	}

}

@Inject在进行自动注入时默认会根据field的名称、method参数的名称寻找对应的bean进行注入,当然这种机制也可以通过@Named或@Qualifier来进行改变。如在上述示例中@Inject标注在field上的情况,我们看到对应的field的名称为“world”,那么当我们的bean容器中有如下两个bean时,将默认注入beanName为world的那个bean。

<bean id="world" class="com.elim.learn.spring.bean.World" p:id="1"/>
<bean id="world2" class="com.elim.learn.spring.bean.World" p:id="2"/>

同样的机制对于方法注入和构造方法注入也是适用的。就这一点而言,我觉得@Inject比@Autowired好用。当容器中不存在对应名称的bean时,将根据类型进行注入,当容器中不存在对应类型时Spring将抛出异常,@Inject没有像@Autowired那样可以指定是否required的属性,所以一旦我们配置了某个field或method等为@Inject,那么bean容器中就一定需要存在对应类型的bean,否则Spring就将抛出异常。另外,当容器中不存在@Inject所标注的field对应名称或method对应参数名称的bean存在时,Spring将根据类型进行注入,如果此时bean容器中存在相同类型的多个bean时,Spring也会抛出异常。这个时候我们就可以通过@Named来指定具体需要注入哪个bean,当然使用@Autowired支持的@Qualifier也是可以的。

17.2 @Named

@Named的功能就相当于Spring标准注解中的@Qualifier。与@Qualifier一样,@Named注解也可以标注在任何@Inject或@Autowired出现的地方,如field、方法参数等。同时@Named也可以标注在类上,当使用@Named标注在类上时其功能就相当于在类上使用@Component进行标注,通过其value属性也可以指定Spring扫描后添加bean定义时对应bean的beanName。而@Qualifier标注在类上时只是定义对应bean的qualifier。

public class Hello {
	
	@Inject
	@Named("world1")
	private World world;

}

上述示例我们使用@Named明确的表示将注入beanName为“world1”的那个bean。需要注意的是使用@Named进行标注时将寻找对应beanName的bean,且一定是beanName,这一点与@Qualifier是不一样的,@Qualifier还可以对应对应bean的qualifier。如上述@Named(“world1”)对应如下这样的配置是行不通的,但如果将@Named(“world1”)替换成@Qualifier(“world1”)它又是可以的。

<bean id="world" class="com.elim.learn.spring.bean.World" p:id="1">
	<qualifier value="world1"/>
</bean>

如下是一个使用@Named标注在通过方法进行注入的方法参数上的示例。

public class Hello {
	
	private World world;
	private BeanA beanA;
	
	@Inject
	public void doSomething(@Named("world2") World world, BeanA beanA) {
		this.world = world;
		this.beanA = beanA;
	}

}

当使用@Named标注在类上时,其功能和用法都与@Component是一样的。如果我们启用了Spring扫描类路径的功能,那么Spring默认也会扫描标注了@Named的类,并将它们作为一个bean定义到对应的bean容器中。如下就是一个使用@Named标注在类上的示例。

@Named
public class Hello {
	
	private World world;
	private BeanA beanA;
	
	@Inject
	public void doSomething(@Named("world2") World world, BeanA beanA) {
		this.world = world;
		this.beanA = beanA;
	}

}

使用@Named标注在类上时,如果没有通过value属性指定对应的beanName,则默认会取类名将首字母小写作为对应的beanName。如上述示例,默认就将使用“hello”作为beanName。

(注:本文是基于Spring4.1.0所写)

目录
相关文章
|
7月前
|
缓存 监控 Java
深入了解Spring中的JSR 303验证和拦截器
深入了解Spring中的JSR 303验证和拦截器
40 0
|
6月前
|
监控 前端开发 Java
学习 [Spring MVC] 的JSR 303和拦截器,提高开发效率
学习 [Spring MVC] 的JSR 303和拦截器,提高开发效率
32 0
|
12月前
|
Java 数据库连接 API
Spring MVC-07循序渐进之验证器 下 (JSR 303验证)
Spring MVC-07循序渐进之验证器 下 (JSR 303验证)
55 0
|
资源调度 JavaScript Java
服务器支持访问静态文件的几种方式:Spring、Tomcat、Vue
服务器支持访问静态文件的几种方式:Spring、Tomcat、Vue
|
消息中间件 JSON 架构师
Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
技术向前的大船,浩浩荡荡不可逆。作为技术人,我们能做的是keep moving,不管是技术架构师还是业务架构师,还是开发工程师!
488 0
Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
|
XML 消息中间件 JSON
Spring Boot 3.0发布,最低支持Java 17,新特性介绍
Spring Boot 3.0正式发布,距离Spring 2.0发布过去了4年半时间。最低支持Java 17,Spring Framework 6.0.本文详细介绍Spring Boot 3.0 新特性。
5344 12
Spring Boot 3.0发布,最低支持Java 17,新特性介绍
|
Java Spring 容器
Spring 国际化支持之 MessageSource
背景 为了友好的支持各个国家的语言,Java 本身已经提供了对国际化的支持,上篇文章《Java 国际化与文本格式化》已经介绍了 Java 对国际化的支持。
271 0
|
SQL XML 前端开发
Spring6详细教程(七)--->Spring对事务的支持
1. 学习视频在b站搜索动力节点即可!!! 2. 从 0 开始学 Java 知识之 Java-学习路线 中的《Spring6--->Spring对事务的支持》,不定期更新所学笔记
233 0
|
安全 小程序 Java
Spring Boot 最新发布,支持 Java 19,这速度太快了。。
Spring Boot 最新发布,支持 Java 19,这速度太快了。。
699 0
Spring Boot 最新发布,支持 Java 19,这速度太快了。。