Spring注解总结[email protected]和@Qualifier、@Resource

前言

由于能力有限,不会过于深入的探讨spring的注解,只会介绍一下注解的基本使用方法

@Autowired

@Autowired可以帮我们注入一个属性,一般作用在普通方法之上(也可以作用的变量上或者构造器上)

@Autowired是根据类型匹配的,所以如果有两个一样类型的参数的时候,会出错

看下下面的例子

public class Bean2 {

	@Override
	public String toString() {
		return "bean2....";
	}
}
public class Bean1 {
	private Bean2 bean2;

	public Bean2 getBean2() {
		return bean2;
	}

	@Autowired
	public void setBean2(Bean2 bean2) {
		this.bean2 = bean2;
	}

	public String toString() {
		return "bean1....";
	}
}

这是一个Bean,在Bean1里有一个属性Bean2,这是利用@Autowired来注入这个属性

相应的xml定义如下

<!--  使用这个扫描使用了注解的包,这样注解才会有用 -->
<context:component-scan base-package="bean" />
<bean id="bean1" class="bean.Bean1"/>
<bean id="bean2" class="bean.Bean2"/>

接着是测试类

public static void main(String[] args) {
	ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
	Bean1 bean1 = (Bean1) ctx.getBean("bean1");
	System.out.println(bean1);
}

这时打印出来是bean2....

证明注入成功了

由于@Autowired是根据类型注入的,那么如果去掉xml文件中的id,也是可以注入成功

@Qualifier

@Qualifier可以缩小匹配的范围

@Qualifier一般和@Autowired来配合使用,以此来解决使用@Autowired时有多个类型匹配的问题

使用方式如下(配置文件和测试代码和上面一样)

public class Bean1 {
	private Bean2 bean2;

	public Bean2 getBean2() {
		return bean2;
	}

	@Autowired
	@Qualifier("bean2")
	public void setBean2(Bean2 bean2) {
		this.bean2 = bean2;
	}

	public String toString() {
		return "bean1....";
	}
}

在使用了@Autowired进行注入之后,又使用了@Qualifier来缩小匹配的范围,即类型为Bean2的且名称为bean2的才会被注入其中,如果找不到则会出错

对于多个参数的方法,如果需要注入,那么@Qualifier可以作用的参数前,这样就可以注入多个参数了

代码如下(Bean3和Bean2一样)

public class Bean1 {
	private Bean2 bean2;
	private Bean3 bean3;

	public Bean2 getBean2() {
		return bean2;
	}

	public Bean3 getBean3() {
		return bean3;
	}

	@Autowired
	public void set(@Qualifier("bean2") Bean2 bean2, @Qualifier("bean3") Bean3 bean3) {
		this.bean2 = bean2;
		this.bean3 = bean3;
	}

	public String toString() {
		return "bean1....";
	}
}

在使用了@Autowired注入时,指定了名称为bean2的bean注入第一个参数,名称为bean3的bean注入第二个参数中,这样就可以注入多个参数了(bean3需要在xml文件中声明)

@Resource

@Resource可以作用在属性上或者方法上,和@Autowired不同的是,@Resource默认是根据名称注入的,在使用的时候指定名称,这样就会找到对应的bean注入,如果没有找到对应的bean,则根据类型注入

使用方式如下(其他代码和上面一样)

public class Bean1 {
	private Bean2 bean2;

	public Bean2 getBean2() {
		return bean2;
	}

	@Resource(name = "bean2")
	public void setBean2(Bean2 bean2) {
		this.bean2 = bean2;
	}

	public String toString() {
		return "bean1....";
	}
}

这样名称为bean2的bean就会注入

@Autowired和@Resource各有各的用法,如果要注入的方法中有多个参数,那么可以使用@Autowired,如果是其他情况,可以使用@Resource

时间: 2024-07-31 01:19:16

Spring注解总结[email protected]和@Qualifier、@Resource的相关文章

Java注解用法[email&#160;protected]

Java注解用法[email protected] 参考地址:https://www.cnblogs.com/perfei456/p/8962167.html 1.注解目标 通过 @SuppressWarnings的源码可知,其注解目标为类.字段.函数.函数入参.构造函数和函数的局部变量.建议注解应声明在最接近警告发生的位置 2.抑止警告的关键字 3.代码示例 示例1--抑制单类型的警告: 1 @SuppressWarnings("unchecked") 2 public void a

Spring高级话题[email&#160;protected]***注解的工作原理

出自:http://blog.csdn.net/qq_26525215 @EnableAspectJAutoProxy @EnableAspectJAutoProxy注解 激活Aspect自动代理 <aop:aspectj-autoproxy/> 开启对AspectJ自动代理的支持. 在用到AOP的自动代理的时候用,如果你理解了Java的动态代理,很容易的就会熟悉AOP的自动代理的. @EnableAsync @EnableAsync注解开启异步方法的支持. 这个相信大家都比较熟悉的.对于异步

从头认识Spring-2.3 注解装配[email&#160;protected](5)-限定器@Qualifier(1)

这一章节我们来具体讨论一下配合@autowired一起使用的限定器@Qualifier. 1.domain(重点) 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch02.topic_1_11; public class Cake { private String name = ""; public String getName() { return name; } public void setName(String name

从头认识Spring-2.4 基于java的标准注解装配[email&#160;protected](2)-通过set方法或者其它方法注入

这一章节我们来讨论一下基于java的标准注解装配标签@Inject是如何通过通过set方法或者其它方法注入? 在使用@Inject标签之前.我们须要在pom文件中面增加以下的代码: <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>

从头认识Spring-2.4 基于java的标准注解装配[email&#160;protected](3)-通过构造器方法注入

这一章节我们来讨论一下基于java的标准注解装配标签@Inject是怎样通过通过构造器方法注入? 在使用@Inject标签之前,我们需要在pom文件里面加入下面的代码: <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> 上面是j

Spring学习记录[email&#160;protected] Propagation

起因 学习Spring的时候就知道aop有一个应用是声明式注解..反正往Service上一丢@Transactional就完事了..不用自己去开启hibernate的session,很简单. 但是@Transactional里有很多属性一直没有用过...其中最让我在意的便是Propagation属性...其他属性都还是蛮好理解的..但是这个属性一直不怎么懂,也一直没怎么去研究.. 大部分情况下的确是使用@Transactional不用额外设置就OK了.因为默认的Propagation是Propa

Spring boot 梳理 [email&#160;protected]、@EnableAutoConfiguration与(@EnableWebMVC、WebMvcConfigurationSupport,WebMvcConfigurer和WebMvcConfigurationAdapter)

@EnableWebMvc=继承DelegatingWebMvcConfiguration=继承WebMvcConfigurationSupport 直接看源码,@EnableWebMvc实际上引入一个DelegatingWebMvcConfiguration @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @Documented @Import({DelegatingWebMvcConfiguration.clas

从头认识Spring-2.3 注解装配[email&#160;protected](3)-通过构造器方法注入

这一章节我们来讨论一下注解装配的@autowired是怎样通过set方法或者其他方法注入? 1.domain 蛋糕类:(不变) package com.raylee.my_new_spring.my_new_spring.ch02.topic_1_8; public class Cake { private String name = ""; public String getName() { return name; } public void setName(String name

从头认识Spring-2.4 基于java的标准注解装配[email&#160;protected]限定器@Named

这一章节我们来讨论一下基于java的标准注解装配标签@Inject的限定器@Named. 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch02.topic_1_16; import javax.inject.Named; @Named("myCake") public class Cake { private String name = ""; public String getName(