以前在编写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类中的字段都已经自动赋值了.