`
234390216
  • 浏览: 10229947 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462463
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775252
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398183
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:394950
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:679881
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:530777
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1183619
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:467469
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151280
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68026
社区版块
存档分类
最新评论

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

阅读更多

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所写)

2
0
分享到:
评论
1 楼 masuweng 2017-08-11  
             

相关推荐

    spring3.0_doc_api

    1. **JSR-330注解支持**:引入了JSR-330规范的注解,如`@Inject`和`@Provider`,与Spring的`@Autowired`和`@Qualifier`一起使用,提供更统一的依赖注入方式。 2. **泛型集合支持**:增强了对泛型类型的处理,使得...

    4Spring自动装配——annotation resource方式

    `@Resource`注解源于JSR-250规范,Spring也对其进行了支持。与`@Autowired`不同,`@Resource`主要关注于名称(name),而非类型(type)。这意味着,即使有多个相同类型的Bean,只要它们的名称匹配,`@Resource`就能...

    spring boot整合JPA——demo

    而JPA是Java的一个标准,由JSR 317和JSR 338定义,实现了ORM(对象关系映射)规范,允许开发者用面向对象的方式来处理数据库。 要整合Spring Boot和JPA,我们需要以下步骤: 1. **添加依赖**:在`pom.xml`或`build...

    Spring依赖注入——java项目中使用spring注解方式进行注入.rar

    4. `@Inject` 注解:来自JSR 330规范,Spring也支持此注解进行依赖注入,与`@Autowired`类似,但不支持属性级别的注入。 三、使用注解注入的步骤 1. 创建Bean:首先,你需要在Spring配置文件中声明你的bean,或者...

    spring 源码中文注释

    此外,Spring框架也引入了JSR-330定义的依赖注入注解,如`@Inject`,并与JSR-250的注解(如`@PostConstruct`、`@PreDestroy`)进行集成,使代码更加简洁。同时,Spring的`@Component`、`@Service`、`@Repository`和`...

    spring 1到3大版本号下的最高版本

    这个版本还增强了对JSR-250(Common Annotations for the Java Platform)的支持,以及对Java Persistence API (JPA) 1.0的集成,使得ORM(对象关系映射)更加便捷。 最后,我们来到Spring 3.x系列的最高版本——...

    Spring 3.x 企业应用开发实战

    此外,Spring 3.0引入了JSR-330标准的依赖注入注解,如@Inject,增强了与其他依赖注入框架的互操作性。 其次,Spring 3.0对AOP(面向切面编程)的支持也有了显著提升。新增了注解驱动的切面定义,如@Transactional...

    Spring MVC-Web(4)

    数据验证通常通过JSR-303/JSR-349的Bean Validation实现,可以在控制器方法执行前对输入数据进行校验。 Spring MVC的模型-视图-适配器(MVC)设计模式促进了代码的解耦。适配器(即DispatcherServlet)处理HTTP请求...

    spring 3.0 jar包

    同时,增强了对JSR-303 Bean Validation的支持,可以在切面中进行数据验证。 4. **数据访问增强**: Spring 3.0增强了对JPA、Hibernate、MyBatis等持久层技术的支持,提供了统一的数据访问抽象,使得更换数据库...

    org.springframework.web的jar包.zip

    《Spring框架Web模块详解——聚焦于WebSocket服务器端点支持》 在Java开发领域,Spring框架以其强大的功能和灵活的设计闻名,而`org.springframework.web`包是Spring框架中的一个重要部分,它提供了处理HTTP请求和...

    Spring3.0源码3

    在Spring 3.0中,引入了ModelAndView的替代品——Model,以及支持RESTful风格的Controller注解。 6. **JSR-303/JSR-349验证**:Spring 3.0集成JSR-303(Bean Validation),提供了数据验证的能力,允许在服务层和...

    spring3.0学习

    Spring 3.0还引入了对JSR-303(Bean Validation)标准的支持,允许开发者在模型层进行数据验证,提高了业务逻辑的健壮性。通过@Valid注解,可以在控制器方法参数上启用验证,Spring会自动调用相应的约束验证器。 ...

    Spring之Spring2.5集成Struts2.2

    首先,Spring 2.5是Spring框架的一个版本,它引入了许多改进和新特性,例如支持JSR-303(Java Bean Validation)和对Java Persistence API(JPA)2.0的增强支持。集成Struts2.2可以让开发者利用Spring管理业务逻辑和...

    Spring之Spring2.5集成Hibernate3.6

    Spring 2.5版本是Spring框架的一个重要里程碑,它引入了许多增强的功能,如依赖注入(DI)的改进、AOP(面向切面编程)的增强以及对JSR-250规范的支持。这些改进使得开发者能够更灵活地管理对象间的依赖关系,并降低...

    maven与spring MVC

    对于数据验证,Spring MVC支持JSR 303/349(Java Bean Validation)规范,允许在控制器层或者模型层定义验证规则。当用户提交表单时,Spring MVC会自动执行这些验证,如果数据无效,会返回错误信息。 DWR的集成: ...

    spring3.x项目开发

    除了上述内容,Spring 3.x还支持JSR-303/JSR-349 Bean Validation,用于验证对象的属性。此外,Spring的AspectJ支持全注解配置,提供了更强大的AOP能力。还有Spring的Messaging模块,用于消息传递,如JMS集成。 总...

    spring 3.0api

    其次,Spring 3.0加强了对Asynchronous处理的支持。通过`@Async`注解,开发者可以轻松创建异步方法,提高应用的并发性能。同时,Spring 3.0也提供了任务执行和调度的增强,包括`ThreadPoolTaskExecutor`和`Task...

    spring2.5中文文档

    其次,Spring 2.5引入了JSR-303 Bean Validation的支持,这是一个用于验证JavaBean属性的标准。这使得开发者可以更方便地在Spring应用中实现数据校验,提高代码质量。例如,@NotNull、@Size等注解可以直接在字段上...

    spring2.5.6

    Spring 2.5.6 版本加强了对JSR-330标准的支持,引入了如`@Inject`注解,使得依赖注入更加标准化。 面向切面编程(AOP)则是Spring提供的一种处理横切关注点的方式,如日志、事务管理等。在Spring 2.5.6中,可以使用...

    spring.jar

    在4.0版本中,增强了对JSR-330标准的支持,使得AOP与依赖注入更好地结合。 四、数据访问/集成(Data Access/Integration) Spring支持各种数据库访问技术,包括JDBC、ORM(Object-Relational Mapping)框架如...

Global site tag (gtag.js) - Google Analytics