Spring 注解实现Bean依赖注入之@Autowired

二、@Autowired:自动装配

自动装配,用于替代基于XML配置的自动装配

基于@Autowired的自动装配,默认是根据类型注入,可以用于构造器、字段、方法注入,使用方式如下:

@Autowired(required=true)  
构造器、字段、方法  

@Autowired默认是根据参数类型进行自动装配,且必须有一个Bean候选者注入,

如果允许出现0个Bean候选者需要设置属性“required=false”,“required”属性含义和@Required一样,

只是@Required只适用于基于XML配置的setter注入方式。

(1)、构造器注入:通过将@Autowired注解放在构造器上来完成构造器注入,默认构造器参数通过类型自动装配,如下所示:

1、准备测试Bean,在构造器上添加@AutoWired注解:

package com.bean;

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

public class TestBean {

	private String message;
	
	@Autowired
	private TestBean(String message){
		this.message = message;
	}
	
	public String getMessage() {
		return message;
	}
}

2、在Spring配置文件添加如下Bean配置:

<bean id="testBean" class="com.bean.TestBean">
	<constructor-arg index="0" ref="message"></constructor-arg>
</bean>

<bean id="message" class="java.lang.String">
	<constructor-arg index="0" value="hello"/>
</bean>

3、测试类如下:

@Test
public void autowiredTest(){
	TestBean bean = ctx.getBean("testBean", TestBean.class);
	Assert.isTrue("hello".equals(bean.getMessage()), "返回不相等");
}

在Spring配置文件中没有对“testBean11”进行构造器注入和setter注入配置,而是通过在构造器上添加@ Autowired来完成根据参数类型完成构造器注入。


(2)、字段注入:通过将@Autowired注解放在构造器上来完成字段注入。

1、准备测试Bean,在字段上添加@AutoWired注解:

package com.bean;

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

public class TestBean {

	@Autowired
	private String message;
	
	public String getMessage() {
		return message;
	}
}

2、在Spring配置文件(chapter12/dependecyInjectWithAnnotation.xml)添加如下Bean配置:

<bean id="testBean" class="com.bean.TestBean"/>

<bean id="message" class="java.lang.String">
	<!-- <constructor-arg name="original" value="hello"/> 也可以这样写-->
	<constructor-arg index="0" value="hello"></constructor-arg>
</bean>

3、测试方法如下:

@Test  
public void testAutowiredForField() {  
    TestBean bean = ctx.getBean("testBean", TestBean.class); 
    Assert.isTrue("hello".equals(bean.getMessage()),"返回不相等");
}  

字段注入在基于XML配置中无相应概念,字段注入不支持静态类型字段的注入。
这样写的话,则要添加 <context:component-scan base-package="com.bean"/> 进行扫描,否则不会注入成功,同时别忘记添加

<?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
           				   http://www.springframework.org/schema/context/spring-context-2.5.xsd">

(3)、方法参数注入:通过将@Autowired注解放在方法上来完成方法参数注入。

1、准备测试Bean,在方法上添加@AutoWired注解:

package com.bean;


import java.util.List;

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

public class TestBean {


	private String message;
	
	private List<String> list;
	
	@Autowired(required = true)
	private void initMessage(String message,List<String> list){
		this.message = message;
		this.list = list;
	}


	@Override
	public String toString() {
		return "TestBean [message=" + message + ", list=" + list + "]";
	}
}


2、在Spring配置文件 添加如下Bean配置:

<bean id="testBean" class="com.bean.TestBean"/>
	  
<bean id="message" class="java.lang.String">
	<!-- <constructor-arg name="original" value="hello"/> -->
	<constructor-arg index="0" value="hello"></constructor-arg>
</bean>


<bean id="list" class="java.util.ArrayList">
<constructor-arg index="0">
	<list>
		<ref bean="message"/>
		<ref bean="message"/>
	</list>
</constructor-arg>
</bean>


3、测试方法如下:

@Test  
public void autowiredTest(){
	TestBean bean = ctx.getBean("testBean", TestBean.class);
	System.out.println(bean);
}

同样别忘记了 添加 <context:component-scan base-package="com.bean"/>
方法参数注入除了支持setter方法注入,还支持1个或多个参数的普通方法注入,在基于XML配置中不支持1个或多个参数的普通方法注入,方法注入不支持静态类型方法的注入。
 
注意“initMessage(String message, ArrayList<String> list)”方法签名中为什么使用ArrayList而不是List呢?
--如果使用 List 则注入进去的list只有一个值,如果使用 ArrayList则注入进来的size有两个值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值