2.3 依赖注入的类型

在Spring中实现Ioc容器的方法是依赖注入,依赖注入的作用是在使用Spring框架创建对象时,动态地将其所依赖的对象(如属性值)注入Bean组件中。Spring框架的依赖注入通常有两种实现方式:一种是构造方法注入,一种是属性setter方法注入。

先创建一个名为ch2的动态Web项目
本次项目的目录结构:

img

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();
    }
}

运行结果:

img

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();

    }
}

运行结果:

img

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容