spring学习之属性注入

首先准备工作

本项目的目录结构如下:

spring中属性的相互关系是通过applicationContext.xml来管理的,spring提倡面向接口的编程,因此在dao层使用接口抽象方法。

下面是各层的代码:

public interface StudentsDAO {

	//保存学生
	public boolean saveStudents(Students s);
}

接口的实现类。

public class StudentsDAOImpl implements StudentsDAO {

	@Override
	public boolean saveStudents(Students s) {
		if(s!=null)
		{
			System.out.println("学号"+s.getSid());
			System.out.println("姓名"+s.getSname());
			System.out.println("年龄"+s.getAge());
			return true;
		}
		else
		{
			return false;
		}
	}

}
public class Students {

	private String sid;
	private String sname;
	private int age;

	public Students() {
		super();
	}
	public Students(String sid, String sname, int age) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.age = age;
	}
	public String getSid() {
		return sid;
	}
	public void setSid(String sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

一定要实现get和set方法,不然在applicationContext.xml中无法实现属性的注入。

public class StudentsService {

	private StudentsDAO sDAO;
	private Students s;
	public StudentsDAO getsDAO() {
		return sDAO;
	}

	public void setsDAO(StudentsDAO sDAO) {
		this.sDAO = sDAO;
	}

	public Students getS() {
		return s;
	}

	public void setS(Students s) {
		this.s = s;
	}

	//保存学生
	public boolean save(){
		if(sDAO.saveStudents(s))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}

接着我们来说明spring的第一种注入方式
setter注入

applicationContext.xml文件如下:

bean studentsService这个类依赖于属性s和sDAO,而s和sDAO又是对bean students和studentsDAO的引用。它们的注入是通过类studentsService中students和studentsDAO的set方法注入进来的。

<?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-3.0.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	">
	<context:annotation-config/>
	<bean name="students" class="com.qzp.model.Students"></bean>
	<bean name="studentsDAO" class="com.qzp.dao.impl.StudentsDAOImpl"></bean>
	<bean name="studentsService" class="com.qzp.service.StudentsService">
		<property name="s" ref="students"></property>
		<property name="sDAO" ref="studentsDAO"></property>
	</bean>
</beans>

附上测试方法:

public  class TestStudentsService extends TestCase{

	public void testSaveStudents(){
		ApplicationContext cxt=new ClassPathXmlApplicationContext("applicationContext.xml");
		Students s=(Students)cxt.getBean("students");
		s.setSid("001");
		s.setSname("qzp");
		s.setAge(25);
		StudentsService sService=(StudentsService)cxt.getBean("studentsService");
		//使用断言,如果二者相等,通过
		Assert.assertEquals(true, sService.saveStudents());
	}
}

第二种注入方式:构造方法注入

在applicationContext.xml的students bean中添加如下的三个值,即可完成构造方法的注入。

如果是string和int类型可以不写,它会帮助你进行类型转换。

<?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-3.0.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	">
	<bean name="students" class="com.qzp.model.Students">
		<constructor-arg index="0" type="java.lang.String" value="001"/>
                <constructor-arg index="1" value="qzp"/>
		<constructor-arg index="2" value="25"/>
	</bean>
	<bean name="studentsDAO" class="com.qzp.dao.impl.StudentsDAOImpl"></bean>
	<bean name="studentsService" class="com.qzp.service.StudentsService">
		<property name="s" ref="students"></property>
		<property name="sDAO" ref="studentsDAO"></property>
	</bean>

</beans>

测试代码如下,此时就不需要在实例化bean时一个个set值进去了。(对比第一种的测试方法)

public  class TestStudentsService extends TestCase{

	public void testSaveStudents(){
		ApplicationContext cxt=new ClassPathXmlApplicationContext("applicationContext.xml");
		StudentsService sService=(StudentsService)cxt.getBean("studentsService");
		//使用断言,如果二者相等,通过
		Assert.assertEquals(true, sService.saveStudents());
	}
}

第三种 使用注解注入

好处不比写一堆长长的applicationContext.xml文件

1.修改applicationContext.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-3.0.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	">
	<!-- 加入对注解的支持 -->
	<context:annotation-config/>
	<bean name="students" class="com.qzp.model.Students"></bean>
	<bean name="studentsDAO" class="com.qzp.dao.impl.StudentsDAOImpl"></bean>
	<bean name="studentsService" class="com.qzp.service.StudentsService"></bean>
</beans>

2.修改studentsService类

其中有两种方法一种是@Resource,另一种是@Autowired

使用@Resource(name="students"),通过name来指定对应的bean的名称。

public class StudentsService {

	//name对应applicationContext中bean的name
	@Resource(name="studentsDAO")
	private StudentsDAO sDAO;
	@Resource(name="students")
	private Students s;
	public StudentsDAO getsDAO() {
		return sDAO;
	}

	public void setsDAO(StudentsDAO sDAO) {
		this.sDAO = sDAO;
	}

	public Students getS() {
		return s;
	}

	public void setS(Students s) {
		this.s = s;
	}

	//保存学生
	public boolean saveStudents(){
		if(sDAO.saveStudents(s))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}

或者使用@Autowired,他会按照类型来匹配使用@Qualfer("students")来指定bean的名称

public class StudentsService {

	//name对应applicationContext中bean的name
	//@Resource(name="studentsDAO")
	//按照类型来匹配,因为它们的类型不同,
	@Autowired
	@Qualifier("studentsDAO")
	private StudentsDAO sDAO;
	//@Resource(name="students")
	@Autowired
	@Qualifier("students")
	private Students s;
	public StudentsDAO getsDAO() {
		return sDAO;
	}

	public void setsDAO(StudentsDAO sDAO) {
		this.sDAO = sDAO;
	}

	public Students getS() {
		return s;
	}

	public void setS(Students s) {
		this.s = s;
	}

	//保存学生
	public boolean saveStudents(){
		if(sDAO.saveStudents(s))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}

3.测试

public  class TestStudentsService extends TestCase{

	public void testSaveStudents(){
		ApplicationContext cxt=new ClassPathXmlApplicationContext("applicationContext.xml");
		StudentsService sService=(StudentsService)cxt.getBean("studentsService");
		//使用断言,如果二者相等,通过
		Assert.assertEquals(true, sService.saveStudents());

	}
}

测试成功。

时间: 2024-10-20 09:55:15

spring学习之属性注入的相关文章

Spring笔记②--各种属性注入

Ioc 反转控制 反转资源获取的方向 分离接口与实现 采用工厂模式 采用反转控制 ? Di 依赖注入 依赖容器把资源注入 ? 配置bean 通过全类名(反射) 配置形式:基于xml方式 Ioc容器的beanFactory&ApplicationContext 依赖注入的方式:属性注入,构造器注入 ? ? Bean必须要有一个无参的构造函数 Class:bean的全类名,通过反射的方式在IOC容器中创建bean,所以要求bean中必须有无参的构造函数 id :bean 的标示,id唯一 ? app

Spring框架笔记(三)——Spring容器、属性注入和构造器注入详解

Spring 容器 在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用. Spring 提供了两种类型的 IOC 容器实现. BeanFactory: IOC 容器的基本实现. ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口. BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身: Appli

SpringIOC学习_属性注入(依赖注入)

一.应用场景:Spring会帮创建实现类的实例,但是有时候我们还需要在类中设置一些属性用于传入设置值,这些跟类紧密关联的属性就叫依赖,通过spring帮忙设置的过程叫依赖注入. 二.依赖注入的实现 A.构造方法的注入. //这样配置bean都是通过无参构造生成bean实例 <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl"/> 通过上面无参构造我们想到是否有有参构造创建实例了,这样不就达到了注入属

Spring学习——DI(依赖注入)

IOC容器,处理对象依赖关系 IOC与DI: IOC :是一个容器,创建对象的容器 DI :在容器创建对象后,处理对象的依赖关系,也叫依赖注入! 方式1:通过set方法注入值 可以给普通属性.集合属性注入值: 1. 必须提供set方法 2. 配置中通过bean的property子节点,给对象属性注入值: 1 <!-- 2 依赖注入,即处理对象的依赖关系!给对象的属性设置值! 3 --> 4 <!-- 1) 给对象属性赋值(通过构造函数)--> 5 <bean id="

spring学习笔记-依赖注入

学习过程访问的地址,按顺序理解: [email protected]注解与自动装配 spring四种依赖注入方式 Spring注解注入 <context:component-scan>使用说明 详细:Spring零配置通过注解实现Bean依赖注入总结

spring HibernateDaoSupport 注解属性注入的方法

/*使用注解属性注入无法调用HibernateDaoSupport中的setSessionFactory方法,需要手动创建,并且setSessionFactory不能被重写 * 需要新建方法,在新方法中调用父类的setSessionFactory方法,显式的指向属性名称*/ @Resource(name="sessionFactory") private void setSF(SessionFactory sessionFactory) { setSessionFactory(sess

【Java Web开发学习】Spring构造器和属性注入

测试类 public class Construct { private String address; private long phone; public Construct(String name, int age) { System.out.println("> " + name + ", " + age); } public String getAddress() { return address; } public void setAddress(

Spring学习(一)---依赖注入和控制反转

Spring Spring是一个从实际开发中抽出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率. Spring为企业应用的开发提供了一个轻量级的解决方案.该解决方案包括:基于依赖注入的核心机制.基于AOP的声明事务管理.与多种持久层技术的整合,以及优秀的Web MVC框架等. 使用Spring管理Bean Spring核心容器就是一个超级大工厂,所有的对象(包括数据源.Hibernate SessionFactory等基础性资

Spring中的属性注入注解

@Inject使用 JSR330规范实现的 默认按照类型注入 如果需要按照名称注入,@Inject需要和@Name一起使用 @Resource JSR250规范实现的,需要导入不同的包 @Resource是按照名称匹配的 @Autowired Spring中定义的注解 默认按照类型注入 如果需要按照名称注入,需要配合@Qualifier注解一起使用 包含一个require属性 原文地址:https://www.cnblogs.com/watertreestar/p/11780306.html