Spring DI 依赖注入案例

Spring DI 依赖注入案例(带参数构造方法依赖注入和setter方法依赖注入和p名称空间注入)

DI 依赖注入:
  简单的说是指对象中的属性的值设置方式不再是调用setter方法进行传值,而是由配置实现经过框架传值。
 
DI操作可以采用两种实现方案:
    1、使用带参构造实现注入

<!-- 采用带参构造的方式实现依赖注入 -->
<bean id="user" class="cn.sz.pojo.User">
    <constructor-arg name="id" value="123"></constructor-arg>
</bean>

    2、使用setter方法实现注入

<!-- 采用setter方法实现依赖注入 -->
<bean id="user" class="cn.sz.pojo.User">
    <property name="id" value="13"></property>
</bean>

补充:constructor和property标签中常用属性:name,value,ref
  name 设置类中的属性名
  value设置属性的具体值
  ref设置bean的id(及关联其它的配置项的id)

下面演示的是带参数构造方法依赖注入和setter方法依赖注入方式:

项目中SpringTest.java测试类使用junit方式测试即单元测试。lib目录下为测试中需要的spring jar包,log4j.jar为日志包,User.java是测试需要的一个实体类,applicationContext.xml为spring的主配置文件,名称可以任意但官方建议使用该默认名称。log4j.properties为日志配置文件。本案例使用的spring版本为 spring4.3.9。

创建一个java项目,项目结构如下:

代码如下:

1、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">    
    <!--DI操作(依赖注入) -->
    <!-- 方式一采用带参构造的方式实现依赖注入 -->
    <bean id="user4" class="cn.sz.pojo.User">
        <constructor-arg name="id" value="123"></constructor-arg>
        <constructor-arg name="name" value="张三"></constructor-arg>
    </bean>
 
    <!-- 方式二:采用setter方法实现依赖注入 ,还演示了结合属性的依赖注入 -->
    <bean id="user5" class="cn.sz.pojo.User">
        <property name="id" value="456"></property>
        <property name="name" value="李四"></property>
        <!-- 数组属性依赖注入 -->
        <property name="strs">
            <array>
                <value>数组属性1</value>
                <value>数组属性2</value>
                <value>数组属性3</value>
            </array>
        </property>
        <!-- list集合属性依赖注入 -->
        <property name="list">
            <list>
                <value>list属性1</value>
                <value>list属性2</value>
                <value>list属性3</value>
            </list>
        </property>
        <!-- set集合属性依赖注入(set集合内容不能重复) -->
        <property name="set">
            <set>
                <value>set属性1</value>
                <value>set属性2</value>
                <value>set属性3</value>
            </set>
        </property>
        <!-- map集合属性依赖注入 -->
        <property name="map">
            <map>
                <entry key="key1" value="map集合属性1"></entry>
                <entry key="key2" value="map集合属性2"></entry>
                <entry key="key3" value="map集合属性3"></entry>
 
            </map>
        </property>
 
        <!--Properties属性依赖注入 -->
        <property name="properties">
            <props>
                <prop key="p1">Properties属性1</prop>
                <prop key="p2">Properties属性2</prop>
            </props>
        </property>
    </bean>
</beans>

2、log4j.properties (日志文件)

[plain] view plain copy
<span style="font-family:Microsoft YaHei;font-size:18px;">log4j.rootLogger=DEBUG,console,FILE  
log4j.appender.console=org.apache.log4j.ConsoleAppender  
log4j.appender.console.threshold=INFO  
log4j.appender.console.layout=org.apache.log4j.PatternLayout  
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n  
log4j.appender.FILE=org.apache.log4j.RollingFileAppender  
log4j.appender.FILE.maxBackupIndex=100  
##log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender   
log4j.appender.FILE.Append=true  
log4j.appender.FILE.File=c:/error1.log  
log4j.appender.FILE.Threshold=INFO  
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout  
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n  
log4j.appender.FILE.MaxFileSize=1MB  
</span>  


3、SpringTest.java (junit测试类)

package cn.sz.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.sz.pojo.User;
public class SpringTest {
    // 方法一:使用带参构造方法实现依赖注入
    @Test
    public void testA() {
        // 读取主配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user4 = ac.getBean("user4", User.class);
        System.out.println(user4.toString());
    }
 
    // 方法二: 使用setter方法实现依赖注入
    @Test
    public void testB() {
        // 读取主配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user5 = ac.getBean("user5", User.class);
        System.out.println(user5.toString());
    }
}


4、User.java (用户实体类)

package cn.sz.pojo;
 
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class User {
    private Integer id;
    private String name;
    private String[] strs;
    private List<String> list;
    private Set<String> set;
    private Map<String, String> map;
    private Properties properties;
 
    // 保留无参的构造方法
    public User() {
 
    }
 
    // 为了演示使用带参数构造的方式实现依赖注入所以提供一个带参的构造方法测试
    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
 
    // 下面的setter方法是测试使用setter方式依赖注入使用的
    public String[] getStrs() {
        return strs;
    }
 
    public void setStrs(String[] strs) {
        this.strs = strs;
    }
 
    public List<String> getList() {
        return list;
    }
 
    public void setList(List<String> list) {
        this.list = list;
    }
 
    public Set<String> getSet() {
        return set;
    }
 
    public void setSet(Set<String> set) {
        this.set = set;
    }
 
    public Map<String, String> getMap() {
        return map;
    }
 
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
 
    public Properties getProperties() {
        return properties;
    }
 
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", strs=" + Arrays.toString(strs) + ", list=" + list + ", set="
                + set + ", map=" + map + ", properties=" + properties + "]";
    }
 
}

testA()测试结果:


testB()测试结果:

以上两种方式以及完成了依赖注入

接下来是名称空间注入:

只是在配置文件有所不同,其他用法和以上的方法一致:

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
   xmlns:user="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xsi:schemaLocation="  
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">  
    <!-- 命名空间创建对象 -->  
   <bean id="user" class="cn.sz.pojo.User" user:uid="101" user:name="李四"></bean>  
</beans>


注:需要使用setter/getter方法
xmlns:user="http://www.springframework.org/schema/p"
user为任意的名称
<bean id="user" class="cn.sz.pojo.User" user:uid="101" user:name="李四"></bean>
bean中user是上面配置的user,名称一致
--------------------- 
作者:benxiaohai888 
来源:CSDN 
原文:https://blog.csdn.net/benxiaohai888/article/details/78369091 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章