美文网首页
Spring_4 属性注入介绍及使用

Spring_4 属性注入介绍及使用

作者: mm_cuckoo | 来源:发表于2017-01-11 14:02 被阅读65次

    IOC 和 DI 区别

    • IOC : 控制反转,把对象创建交给spring 进行配置。
    • DI : 依赖注入,向类里面的属性中设置值。
    • 关系 : 依赖注入不能单独存在,需要在IOC基础之上完成操作。

    属性注入

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

    在 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方法注入属性值,需要注意一下几点,

    • 要在对应的实体类中添加需要注入的属性的set方法。
    • beans.xml 中<property name="name" value="战士"/>name 对应实体中的要注入的属性名,value 是name设置的属性值对应的内容。

    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配置也非常简单,看下面示例:

    • 实体类:

      public class UserP {
          private String pname;
          public void setPname(String pname) {
              this.pname = pname;
          }
          
          public void show() {
              System.out.println("pname:" + pname);
          }
      }
      
      
    • 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="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 类型
    • 创建实体bean
    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>
    

    相关文章

      网友评论

          本文标题:Spring_4 属性注入介绍及使用

          本文链接:https://www.haomeiwen.com/subject/vghrbttx.html