Spring学习(8)--- @Autowired注解(一)

本文详细介绍了Spring框架中@Autowired注解的使用方式,包括将其应用于传统setter方法、构造器和成员变量,以及如何通过配置避免autowiring失败。通过创建接口和其实现类,并使用XML配置进行实例化,演示了@Autowired注解在实际项目中的应用。此外,展示了如何在单元测试中验证注解功能,确保其正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring学习(8)--- @Autowired注解(一)

  • 可以将@Autowired注解为“传统”的setter方法
package com.mypackage;

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

public class SimpleMovieLister {
	private MovieFinder movieFinder;

	@Autowired
	public void setMovieFinder(MovieFinder movieFinder) {
		this.movieFinder = movieFinder;
	}
	
	//.....
}
  •  可用于构造器或成员变量
package com.mypackage;

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

public class SimpleMovieLister {
	
	@Autowired
	private BeanAnnotation beanAnnotation;
	
	private MovieFinder movieFinder;

	@Autowired
	public void setMovieFinder(MovieFinder movieFinder) {
		this.movieFinder = movieFinder;
	}
	
	//.....
}
  •  默认情况下,如果因找不到合适的bean将会导致autowiring失败抛出异常,可以通过下面的方式避免
package com.mypackage;

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

public class SimpleMovieLister {
	private MovieFinder movieFinder;

	@Autowired(required=false)
	public void setMovieFinder(MovieFinder movieFinder) {
		this.movieFinder = movieFinder;
	}
	
	//.....
}
  •  每个类只能有一个构造器被标记为required=true
  • @Autowired的必要属性,建议会用@Required注解

 例子:

先新建两个接口(InjectionService、InjectionDAO),及实现类

package com.mypackage;

public interface InjectionDAO {
	
	public void save(String args);
}

 

package com.mypackage;

import org.springframework.stereotype.Repository;

@Repository
public class InjectionDAOImpl implements InjectionDAO {

	public void save(String args) {
		//模拟数据库操作
		System.out.println("DAO保存数据:" + args);
	}

}

 

package com.mypackage;

public interface InjectionService {

	public void save(String args);
}

 

package com.mypackage;

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

@Service
public class InjectionServiceImpl implements InjectionService{

	@Autowired
	private InjectionDAO injectionDAO;

	public void save(String s){
		//模拟业务操作
		System.out.println("Service接收参数:"+s);
		s=s+":"+this.hashCode();
		injectionDAO.save(s);
	}
}

XML配置:

<?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-4.1.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.1.xsd">
        
        <context:component-scan base-package="com.mypackage">
        </context:component-scan>    
</beans>

  单元测试:

package com.mypackage;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class UnitTest {
	
	@Test
	public void testAutoWired(){
		ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-beanannotation.xml");  
		InjectionService service=(InjectionService)context.getBean("injectionServiceImpl");
		service.save("this is autowired");;
		
	}
}

 结果:

2015-7-6 15:52:26 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1342a80d: startup date [Mon Jul 06 15:52:26 CST 2015]; root of context hierarchy
2015-7-6 15:52:26 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring-beanannotation.xml]
Service接收参数:this is autowired
DAO保存数据:this is autowired:1811560891

 

 

@Autowired也可应用于构造器

修改InjectionServiceImpl实现类(添加setter)

package com.mypackage;

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

@Service
public class InjectionServiceImpl implements InjectionService{
	
	private InjectionDAO injectionDAO;
	
	@Autowired
	public void setInjectionDAO(InjectionDAO injectionDAO) {
		this.injectionDAO = injectionDAO;
	}

	public void save(String s){
		//模拟业务操作
		System.out.println("Service接收参数:"+s);
		s=s+":"+this.hashCode();
		injectionDAO.save(s);
	}
}

 测试结果:

2015-7-6 15:55:23 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@939b78e: startup date [Mon Jul 06 15:55:23 CST 2015]; root of context hierarchy
2015-7-6 15:55:23 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring-beanannotation.xml]
Service接收参数:this is autowired
DAO保存数据:this is autowired:1860295362

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值