在Spring中实现Ioc容器的方法是依赖注入,依赖注入的作用是在使用Spring框架创建对象时,动态地将其所依赖的对象(如属性值)注入Bean组件中。Spring框架的依赖注入通常有两种实现方式:一种是构造方法注入,一种是属性setter方法注入。
先创建一个名为ch2的动态Web项目
本次项目的目录结构:
1.构造方法注入
Spring框架可以采用java反射机制,通过构造方法完成依赖注入
1.1创建Dao
在ch2应用中创建Dao包,并在该包中创建TestDIDao接口和接口实现类TestDIDaoImpl。创建Dao的目的是在service中使用构造方法注入TestDIDao接口对象。
TestDIDao.java
package dao;
public interface TestDIDao {
public void sayHello();
}
TestDIDaoImpl.java
package dao;
public class TestDIDaoImpl implements TestDIDao {
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("Hello in dao");
}
}
1.2创建service
在ch2应用中,创建service包,并在该包中创建TestDIService接口和接口实现类TestDIServiceImpl中使用构造方法依赖注入TestDIDao接口对象
TestDIService.java
package service;
public interface TestDIService {
public void sayHello();
}
TestDIServiceImpl.java
package service;
import dao.TestDIDao;
public class TestDIServiceImpl implements TestDIService {
private TestDIDao testDIDao;
//构造方法,用于实现依赖注入
public TestDIServiceImpl(TestDIDao testDIDao) {
super();
this.testDIDao = testDIDao;
}
public void sayHello() {
//调用testDIDao中的sayHello方法
testDIDao.sayHello();
System.out.println("hello in service1");
}
}
1.3编写配置文件
在src根目录下,创建Spring配置文件applicationContext.xml.在配置文件中,首先,将dao.TestDIDaoImpl类托管给Spring,让Spring创建其对象。其次,将service.TestDIServiceImpl类托管Spring,让Spring创建其对象,同事给构造方法传递实参。
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">
<!-- 将指定类TestDaoImpl配置给Spring,让Spring创建其实例 -->
<bean id="myTestDIDao" class="dao.TestDIDaoImpl" />
<bean id="testDIService" class="service.TestDIServiceImpl">
<constructor-arg index="0" ref="myTestDIDao" />
</bean>
</beans>
1.4创建test
在ch2应用中,创建test包,并在该包中创建测试类TestDI,具体代码如下:
Test.java
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import dao.TestDIDao;
import service.TestDIService;
public class Test {
public static void main(String[] args) {
// 初始化Spring容器ApplicationContext,加载配置文件
ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
TestDIService ts = (TestDIService)appCon.getBean("testDIService");// test为配置文件中的id
ts.sayHello();
}
}
运行结果:
2.属性setter方法注入
setter方法注入是Spring框架中最主流的注入方式,他利用Java Bean规范所定义的setter方法来完成注入,灵活且可读性高。setter方法注入,Spring框架也是使用Java反射机制实现的。
2.1创建接口实现类TestDIServiceImpl1
在service包中,创建接口实现类TestDIServiceImpl1,在TestDIServiceImpl1中使用属性setter方法依赖注入TestDIDao接口对象
TestDIServiceImpl1.java
package service;
import dao.TestDIDao;
public class TestDIServiceImpl1 implements TestDIService{
private TestDIDao testDIDao;
public void setTestDIDao(TestDIDao testDIDao) {
this.testDIDao = testDIDao;
}
public void sayHello() {
testDIDao.sayHello();
System.out.println("hello in service2");
}
}
2.2将TestDIServiceImpl1类托管Spring
将service.TestDIServiceImpl1类托管给Spring,让Spring创建其对象。同时,调用TestDIServiceImpl1类的setter方法完成依赖注入。在配置文件添加如下代码:
<!-- 使用setter方法注入 -->
<bean id="testDIService1" class="service.TestDIServiceImpl1">
<property name="testDIDao" ref="myTestDIDao" />
</bean>
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">
<!-- 将指定类TestDaoImpl配置给Spring,让Spring创建其实例 -->
<bean id="myTestDIDao" class="dao.TestDIDaoImpl" />
<bean id="testDIService" class="service.TestDIServiceImpl">
<constructor-arg index="0" ref="myTestDIDao" />
</bean>
<!-- 使用setter方法注入 -->
<bean id="testDIService1" class="service.TestDIServiceImpl1">
<property name="testDIDao" ref="myTestDIDao" />
</bean>
</beans>
2.3在test中测试setter方法注入
在Test.java主类中,添加如下代码,测试setter方法注入:
TestDIService ts1 = (TestDIService)appCon.getBean("testDIService1");// test为配置文件中的id
ts1.sayHello();
Test.java
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import dao.TestDIDao;
import service.TestDIService;
public class Test {
public static void main(String[] args) {
// 初始化Spring容器ApplicationContext,加载配置文件
ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
TestDIService ts = (TestDIService)appCon.getBean("testDIService");// test为配置文件中的id
ts.sayHello();
TestDIService ts1 = (TestDIService)appCon.getBean("testDIService1");// test为配置文件中的id
ts1.sayHello();
}
}
运行结果: