Spring_4 属性注入介绍及使用

2017-01-11  本文已影响65人  mm_cuckoo

IOC 和 DI 区别

属性注入

属性注入是在创建对象时候,向类里面属性里面设置值。

在 Java 中属性注入的三种方式

  1. 使用 set 方法注入
public class User{
    private String name;
    public void setName(String name){
        this.name = name;
    }
}

User user = new User();
user.setName("abcd");
  1. 使用有参构造注入
public class User{
    private String name;
    public User(String name){
        this.name = name;
    }
}

User user = new User("abc");
  1. 使用接口注入
public interface Dao{
    public void insert(String name);
}

public class DaoImpl implements Dao{
    private String name;
    
    public void insert(String name){
        this.name = name;
    }
}

在 Spring 框架里面,支持两种方式

  1. set 方法注入(重点)

实体类

package com.sfox.bean;

public class Book {
    private String name;
    public void setName(String name){
        this.name = name;
    }
    
    public void putMsg(){
        System.out.println("out put name:" + name);
    }
}


beans.xml配置

<!-- 使用set方法注入属性 -->
<bean id="book" class="com.sfox.bean.Book">
    <!-- 注入属性值
        name 属性:实体类里面定义的属性
        value 属性:设置具体的值
    -->
    <property name="name" value="战士"/>
</bean>
  1. 有参数构造注入

实体类

package com.sfox.bean;

public class Book {
    private String name;
    public Book(String name){
        this.name = name;
    }
    
    public void putMsg(){
        System.out.println("out put name:" + name);
    }
}

上面代码是使用set方法注入属性值,需要注意一下几点,


beans.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">
    
    <!-- 有参数构造注入-->
    <bean id="book" class="com.sfox.bean.Book">
        <constructor-arg name="name" value="王五"/>
    </bean>
</beans>

通过上面代码,可以知道有参构造注入的方法,在使用有参构造注入的时候,需要注意,在beans.xml 文件中bean的配置,<constructor-arg name="name" value="王五"/> name 对应实体中的要注入的属性名,value 是name设置的属性值对应的内容。

注入对象类型属性值

下面的示例是向一个 Service 中注入一个 Dao ,在Service 中调用注入的 Dao.


实体Service

package com.sfox.bean;

public class ServiceDao {
    
    private BookDao bookDao;
    
    public void setBookDao(BookDao bookDao){
        this.bookDao = bookDao;
    }
    
    public void serviceOut(){
        System.out.println("service out......");
        bookDao.bookDaoOut();
    }
}


实体Dao

package com.sfox.bean;

public class BookDao {
    public void bookDaoOut(){
        System.out.println("book Dao....");
    }
}


beans.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">
    
    <bean id="bookDao" class="com.sfox.bean.BookDao"/>
    <bean id="serviceDao" class="com.sfox.bean.ServiceDao">
        <!-- 注入dao 对象
            name 属性值:ServiceDao 类里面属性名称
                        现在不要写value属性,因为是对象
            ref 属性: dao 配置bean标签中的id值
         -->
        <property name="bookDao" ref="bookDao"/>
    </bean>
</beans>

P 命名空间注入

p命名空间注入和上面介绍的有些相同,很简单,在约束中加入如下约束:

xmlns:p="http://www.springframework.org/schema/p"

好了,现在我们就可以使用p命名空间注入了。
P命名空间注入bean配置也非常简单,看下面示例:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
    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">
        <bean id="userp" class="com.cfox.spring.UserP" p:pname="wangwu"></bean>
</beans>

说明:在约束中定义P命名空间,然后在bean 中使用 p:变量 对变量进行赋值。

复杂类型注入

复杂类型注入其实也非常简单,在<bean>标签中使用<property>,具体看下面示例:

  1. 数组
  2. list 类型
  3. set 类型
  4. map 类型
  5. properties 类型
public class MultType {
    private String[] arr;
    private ArrayList<String> list;
    private Set<String> set;
    private Map<String, String> map;
    private Properties properties;
    public void setArr(String[] arr) {
        this.arr = arr;
    }
    public void setList(ArrayList<String> list) {
        this.list = list;
    }
    public void setSet(Set<String> set) {
        this.set = set;
    }
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
    public void show() {
        System.out.println( "MultType [arr=" + Arrays.toString(arr) + ", list=" + list
                + ", set=" + set + ", map=" + map + ", properties="
                + properties + "]");
    }
}

下面我们看一下beans.xml 中如何配置向bean 中注入结合属性的:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
    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">

        <bean id="multType" class="com.cfox.spring.MultType">
            <!-- 数组 -->
            <property name="arr">
                <list>
                    <value>arr1</value>
                    <value>arr2</value>
                    <value>arr3</value>
                </list>
            </property>
            
            <!-- list 集合 -->
            <property name="list">
                <list>
                    <value>zhangsan</value>
                    <value>wangwu</value>
                </list>
            </property>
            <!-- set 集合 -->
            <property name="set">
                <set>
                    <value>hello</value>
                    <value>good</value>
                </set>
            </property>
            <!-- map 集合 key->value -->
            <property name="map">
                <map>
                    <entry key="key1" value="value1"></entry>
                    <entry key="key2" value="value2"></entry>
                    <entry key="key3" value="value3"></entry>
                </map>
            </property>
            <!-- properties -->
            <property name="properties">
                <props>
                    <prop key="pro1">pro.value1</prop>
                    <prop key="pro2">pro.value2</prop>
                </props>
            </property>
        </bean>
</beans>
上一篇下一篇

猜你喜欢

热点阅读