Spring使用@Autowired注解自动装配

在Spring中可以使用@Autowired注解通过setter方法,构造函数或者字段自动装配bean,此外,他可以在一个特定的bean属性自动装配。

下面通过一个例子来实现通过@Autowired来进行自动装配

1.首先配置俩个bean,建立俩个bean之间的关联关系。建立配置文件

package com.hebeu.model;

public class Person {
	
	private int age;
	private String name;
	private String addrss;
	
	public Person(){
		
	}

	public Person(int age, String name, String addrss) {
		super();
		this.age = age;
		this.name = name;
		this.addrss = addrss;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAddrss() {
		return addrss;
	}

	public void setAddrss(String addrss) {
		this.addrss = addrss;
	}
	
}
package com.hebeu.model;

public class Customer {

	private int type;
	private String action;
	private Person person;
	
	public Customer(){
		
	}
	
	public Customer(int type, String action, Person person) {
		super();
		this.type = type;
		this.action = action;
		this.person = person;
	}

	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}

	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}

	public Person getPerson() {
		return person;
	}

	public void setPerson(Person person) {
		this.person = person;
	}
	
	
}
建立这俩个bean,他俩之间有关联关系。

2. 注册AutowiredAnnotationBeanPostProcessor:它的作用是当Spring容器启动时,AutowiredAnnotationBeanPostProcessor将自动扫描Spring容器中所有的bean,当发现bean中拥有@Autowired注释时就找到和其匹配的bean,并注入到对应的地方去。

注册AutowiredAnnotationBeanPostProcessor有俩种方法可以做到。

   1.添加Spring上下文和<context:annotation-config />到配置文件中。

<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-3.0.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	
	<context:annotation-config />
	<!-- 配置顾客这个bean -->
	<bean name="customer" class="com.hebeu.model.Customer">
		<property name="type" value="1" />
		<property name="action" value="buy" />
	</bean>	
	
	<bean name="person" class="com.hebeu.model.Person">
		<property name="age" value="12"/>
		<property name="name" value="张三"/>
		<property name="address" value="河北省张家口市"/>
	</bean>
	
</beans> 
   2.直接在配置文件中包含AutowiredAnnotationBeanPostProcessor.配置文件也很简单

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	
	<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
	<bean name="customer" class="com.hebeu.model.Customer">
		<property name="type" value="1" />
		<property name="action" value="buy" />
	</bean>	
	
	<bean name="person" class="com.hebeu.model.Person">
		<property name="age" value="12"/>
		<property name="name" value="张三"/>
		<property name="address" value="河北省张家口市"/>
	</bean>
	
</beans> 

3.在bean中使用@Autowired注解,他可以在setter方法,构造函数以及字段中使用

      1.在setter()方法上添加注解

package com.hebeu.model;

import org.springframework.beans.factory.annotation.Autowired;

public class Customer {

	private int type;
	private String action;
	private Person person;
	
	public Customer(){
		
	}
	
	public Customer(int type, String action, Person person) {
		super();
		this.type = type;
		this.action = action;
		this.person = person;
	}

	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}

	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}

	public Person getPerson() {
		return person;
	}

	@Autowired
	public void setPerson(Person person) {
		this.person = person;
	}
}

        2.在构造方法中使用【要求构造方法中只有一个被bean变量】

package com.hebeu.model;

import org.springframework.beans.factory.annotation.Autowired;

public class Customer {

	private int type;
	private String action;
	private Person person;
	
	public Customer(){
		
	}
	
	@Autowired
	public Customer(Person person) {
		this.person = person;
	}

	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}

	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}

	public Person getPerson() {
		return person;
	}

	public void setPerson(Person person) {
		this.person = person;
	}
	
	
}

        3.在字段中使用

package com.hebeu.model;

import org.springframework.beans.factory.annotation.Autowired;

public class Customer {

	private int type;
	private String action;
	@Autowired
	private Person person;
	
	public Customer(){
		
	}
	
	public Customer(Person person) {
		this.person = person;
	}

	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}

	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}

	public Person getPerson() {
		return person;
	}

	public void setPerson(Person person) {
		this.person = person;
	}
	
}

在实际中,在字段上进行注解最为常用.通常在JavaEE项目中,对bean进行注入的时候,有时候我们会使用@Resource注解,这个也可以实现自动装配bean的功能。下面简单的区别下这俩个注解:

@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:

@Autowired() @Qualifier("baseDao"

private BaseDao baseDao;   


@Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定, 如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

@Resource(name="baseDao")   

private BaseDao baseDao;   


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值