版权声明:转载请注明出处! https://blog.csdn.net/yxw908186797/article/details/88257002
先简述一点概念。
Spring中实现IoC容器的方法是依赖注入,依赖注入的作用是在使用Spring框架创建对象时动态地将其所依赖的对象(例如属性值)注入Bean组件中。
Spring框架的依赖注入有使用构造方法注入 和 使用属性的sertter方法注入。
代码准备工作
先写好被用的代码,目录结果看包名。
package dao;
public interface TestDIDao {
public void sayHello();
}
package dao.impl;
import dao.TestDIDao;
import org.springframework.stereotype.Service;
@Service
public class TestDIDaoImpl implements TestDIDao{
@Override
public void sayHello() {
System.out.println("Hello, 关注我的博客吧!");
}
}
package service;
public interface TestDIService {
public void sayHello();
}
package service.impl;
import dao.TestDIDao;
import service.TestDIService;
public class TestDIServiceImpl implements TestDIService{
private TestDIDao testDIDao;
//构造方法,用于实现依赖注入接口对象 testDIDao
public TestDIServiceImpl(TestDIDao testDIDao) {
super();
this.testDIDao = testDIDao;
}
@Override
public void sayHello() {
testDIDao.sayHello();
System.out.println("TestDIService 构造方法注入 say : 请帮我点个赞 。");
}
}
一、使用构造方法注入
在src根目录下创建Spring配置文件 applicationContext.xml 。
在文件中,先将 dao。TestDIDaoImpl类托管给Spring,让其创建对象。
再将servlce.TestDIServiceImpl类也托管给Spring,同时给构造方法传递参数。
记得看注释!
代码如下:
注意:<constryctor-arg> 用于定义类的构造方法的参数,index定义参数的位置,ref指定某个实例的引用(例如本示例是myTestDIDao)!
<?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.impl.TestDIDaoImpl" />
<!-- 使用构造方法注入 -->
<bean id="testDIService" class="service.impl.TestDIServiceImpl">
<!-- 将myTestDIDao通过构造函数注入到TestDIServiceImpl类的属性 testDIDao上-->
<constructor-arg index="0" ref="myTestDIDao"/>
</bean>
</beans>
在test包中创建测试类:
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.TestDIService;
public class TestDI {
public static void main(String[] args) {
//这里不懂得话,看上一篇博客!
ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
//ͨ获取容器自动实例化的testDIService。IoC的作用就是这个!我们不需要再去new,再去传递构造函数的参数。
TestDIService ts = (TestDIService)appCon.getBean("testDIService");
ts.sayHello();
}
}
结果如下:
二、使用属性的setter方法注入
学过JavaBean应该都知道Bean的get和set方法。
使用setter方法注入是Spring框架中最主流的注入方式。
将TestDIServiceImpl中的sayHello方法略作修改并加上属性testDIDao的setter方法。
package service.impl;
import dao.TestDIDao;
import service.TestDIService;
public class TestDIServiceImpl implements TestDIService{
private TestDIDao testDIDao;
//setter方法
public void setTestDIDao(TestDIDao testDIDao) {
this.testDIDao = testDIDao;
}
@Override
public void sayHello() {
testDIDao.sayHello();
System.out.println("TestDIService setter方法注入 say : 请帮我点个赞 。");
}
}
1、 将TestDIServiceImpl托管给Spring,同时调用TestDIServiceImpl的setter方法完成依赖注入。将配置文件中的testDIService的bean部分改成如下:
< property >标签是sertter方法使用的标签,与<constryctor-arg>不同,需要注意!
<!-- 使用setter方法注入 -->
<bean id="testDIService" class="service.impl.TestDIServiceImpl">
<!-- 调用TestDIServiceImpl类的setter方法,将myTestDIDao注入到 TestDIServiceImpl类的属性testDIDao上 -->
<property name="testDIDao" ref="myTestDIDao"/>
</bean>
如果不会改,你需要再好好的理解一下XML的配置了!
2、
运行
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.TestDIService;
public class TestDI {
public static void main(String[] args) {
//这里不懂得话,看上一篇博客!
ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
//ͨ获取容器自动实例化的testDIService。IoC的作用就是这个!我们不需要再去new,再去传递构造函数的参数。
TestDIService ts = (TestDIService)appCon.getBean("testDIService");
ts.sayHello();
}
}
结果如下: