五、Spring的依赖注入

以前在编写Service层的逻辑的时候经常需要手动创建Dao层的对象,然后调用其对应的持久层逻辑。

现在有了Spring就无需再手动创建Dao层的对象了,直接在配置文件中指定好要使用到对象,然后由Spring帮我们注入相应的值。

今天介绍2种属性注入方式,分别是:setter方法和构造方法方式注入

setter方法注入方式

下面直接上代码:
UserDaoImpl.java


package blog.csdn.net.mchenys.dao.impl;

import blog.csdn.net.mchenys.dao.UserDao;

public class UserDaoImpl implements UserDao{

	@Override
	public void sayHello() {
		System.out.println("UserDaoImpl sayHello...");
		
	}
	
}

UserServiceImpl.java

package blog.csdn.net.mchenys.service.impl;

import blog.csdn.net.mchenys.dao.UserDao;
import blog.csdn.net.mchenys.service.UserService;

public class UserServiceImpl implements UserService {

	// 声明需要注入的字段
	private String username;
	private UserDao userDao;

	// 必须提供set方法给Spring注入值
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	@Override
	public void sayHello() {
		System.out.println("UserServiceImpl sayHello...username=" + username);
		// 直接调用dao的方法
		userDao.sayHello();
	}

}

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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- 添加具体的类,id相当于key,可随意起名,class必须是完整类路径名 -->
	<!-- 注册UserDaoImpl类 -->
	<bean id="userDao" class="blog.csdn.net.mchenys.dao.impl.UserDaoImpl"></bean>

	<!-- 注册UserServiceImpl类 -->
	<bean id="userService" class="blog.csdn.net.mchenys.service.impl.UserServiceImpl">

		<!-- 
			name:该类的字段名,需要提供setXxx方法 ,注意该Xxx命名必须和name的值一样
			value:给该字段赋值 
		-->
		<property name="username" value="张三"></property>

		<!-- 
			name:该类的字段名,需要提供setXxx方法,注意该Xxx命名必须和name的值一样
			ref:关联的bean对应的id,由于该字段的值是一个类,并且在配置文件中已经配置过,则用ref来指定 
		-->
		<property name="userDao" ref="userDao"></property>
	</bean>


</beans>

测试类

package blog.csdn.net.mchenys.test;

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

import blog.csdn.net.mchenys.service.UserService;

public class Demo2 {

	@Test
	public void test1() {
		// 创建Spring的工厂类:
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		// 通过工厂解析XML获取Bean的实例.
		UserService userService = (UserService) applicationContext.getBean("userService");
		userService.sayHello();
	}
}

运行后,控制台输出如下内容:
在这里插入图片描述
由此可见,我们定义在UserServiceImpl 中的字段都自动的被Spring注入了相应的值,该值就是我们事先配置在其配置文件中的值.

构造方法注入方式

编写Java的类,提供构造方法

Car.java

package blog.csdn.net.mchenys.domain;

public class Car {
	private String name;
	private double money;

	public Car(String name, double money) {
		this.name = name;
		this.money = money;
	}

	@Override
	public String toString() {
		return "Car [name=" + name + ", money=" + money + "]";
	}
}

Person.java

package blog.csdn.net.mchenys.domain;

public class Person {
	private String username;
	private Car car;

	public Person(String username, Car car) {
		this.username = username;
		this.car = car;
	}

	@Override
	public String toString() {
		return "Person [username=" + username + ", car=" + car + "]";
	}

}

编写配置文件

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">

	<!-- 添加具体的类,id相当于key,可随意起名,class必须是完整类路径名 -->

	<!-- 注册Car类 -->
	<bean id="car" class="blog.csdn.net.mchenys.domain.Car">
		<constructor-arg name="name" value="儿童玩具车"/>
		<constructor-arg name="money" value="1000"/>
	</bean>
	
	<!-- 注册Person类 -->
	<bean id="person" class="blog.csdn.net.mchenys.domain.Person">
		<constructor-arg name="username" value="胜哥"/>
		<!--特别注意,如果字段是一个类对象,那么这需要通过ref属性来指定值,该值对应bean标签的id属性  -->
		<constructor-arg name="car" ref="car"/>
	</bean>
</beans>

测试代码:

@Test
	public void test3() {
		// 创建Spring的工厂类:
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		// 通过工厂解析XML获取Bean的实例.
		Person person = (Person) applicationContext.getBean("person");
		System.out.println(person);
	}

运行结果如下:
在这里插入图片描述
可以看到Person类和Car类中的字段都已经自动赋值了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值