Spring IoC 容器:将bean的实例交给spring容器来控制管理,控制权发生了变化,spring通过java反射的机制来实现依赖注入的,依赖注入有两种方式:构造方法注入,setter方法注入
1.Spring Ioc 的设计主要通过两个接口:
- BeanFactory(在实际开发中不常见)
BeanFactory提供了完整的IoC服务,是一个管理Bean的工厂,主要负责初始化各种Bean,在创建BeanFactory实例时需要XML的绝对路径
public class Test {
public static void main(String[] args) {
//初始化容器,加载配置文件
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("E:\\idear
project\\Spring\\src\\main\\resources\\beans.xml"));
TestDao test = (TestDao) beanFactory.getBean("hello");
test.hello();
}
}
- ApplicationContext
ApplicationContext是BeanFactory的子接口,也称应用上下文。除了包含BeanFactory所以功能外,还添加了国际化,资源访问,事件传播等内容的支持。
public class Test {
public static void main(String[] args) {
//初始化容器,加载配置文件,ClassPathXmlApplicationContext从类路径目录(src)中寻找xnl文件
ApplicationContext context =
new ClassPathXmlApplicationContext("beans.xml");
TestDao test = (TestDao) context.getBean("hello");
test.hello();
}
}
2.依赖注入类型
两种实现方式:构造方法注入,属性setter方法注入
- 构造方法注入,主要在service的实现类中编写一个构造方法,把Dao层的方法注入到构造器中,然后调用其方法
public interface TestDao {
void hello();
}
public class TestDaoImpl implements TestDao {
@Override
public void hello() {
System.out.println("Dao层:您好");
}
}
service层
public interface TestServic {
void hello();
}
public class TestServicImpl implements TestServic{
private TestDao dao;
public TestServicImpl(TestDao dao){
this.dao=dao;
}
@Override
public void hello( ) {
dao.hello();
System.out.println("构造方法注入:");
}
}
xml配置
<bean id="hello" class="com.dao.TestDaoImpl"/>
//使用构造方法注入,index用于定位构造器参数的位置,ref:某个实例的引用
<bean id="service" class="com.service.TestServicImpl">
<constructor-arg index="0" ref="hello"/>
</bean>
测试
public class Test {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("beans.xml");
TestServic servic = (TestServic) context.getBean("service");
servic.hello();
}
}
- 属性setter方法注入,其他不变,service实现类和配置文件有变化
service实现类
public class TestServicImpl implements TestServic{
private TestDao dao;
//Dao的setter方法
public void setDao(TestDao dao) {
this.dao = dao;
}
@Override
public void hello( ) {
dao.hello();
System.out.println("setting方法注入");
}
XML配置
<bean id="hello" class="com.dao.TestDaoImpl"/>
<bean id="service" class="com.service.TestServicImpl">
<property name="dao" ref="hello"/>
</bean>