美文网首页
Spring继承与依赖注入-three

Spring继承与依赖注入-three

作者: sunxiaohang | 来源:发表于2018-03-15 13:28 被阅读206次
    Spring Bean 定义继承
    • Bean可以通过设置配置文件来定义继承关系
    • 子 bean 的定义继承父定义的配置数据。子定义可以根据需要重写一些值,或者添加其他值。tip:Spring Bean 定义的继承与 Java 类的继承无关,但是继承的概念是一样的。
    • 当你使用基于 XML 的配置元数据时,通过使用父属性,指定父 bean 作为该属性的值来表明子 bean 的定义。

    通过XML配置文件实现继承关系实例

    <bean id="person" class="com.example.Person">
          <property name="name" value="swift"/>
          <property name="details" value="animal can speak"/>
       </bean>
    
       <bean id="student" class="com.example.Student" parent="person">
          <property name="name" value="study"/>
          <property name="details" value="good good study, day day up!"/>
       </bean>
    

    tip:在定义Student类的时候我们不再需要继承Person类

    Bean 定义模板
    <bean id="person" abstract="true">
          <property name="name" value="swift"/>
          <property name="details" value="animal can speak"/>
       </bean>
    
       <bean id="student" class="com.example.Student" parent="person">
          <property name="name" value="study"/>
          <property name="details" value="good good study, day day up!"/>
       </bean>
    

    person 自身不能被实例化,因为它是不完整的(没有指定class属性),而且它也被明确地标记为抽象的。当一个定义是抽象的,它仅仅作为一个纯粹的模板 bean 定义来使用的,充当子定义的父定义使用。

    Spring 依赖注入

    当编写一个复杂的 Java 应用程序时,应用程序的 java 有多个对象,应用程序类应该尽可能独立于其他 Java 类来增加这些类重用的可能性,依赖注入DI
    (或有时称为布线)有助于把这些类粘合在一起,同时保持他们独立

    • 构造函数注入
    public class Person{
       private Speak speak;
       public Person(Speak speak) {
          this.speak= speak;
       }
    }
    

    依赖关系通过类构造函数被注入到 Person类中。

    • setter方法注入
    public class Person{
       private Speak speak;
       public void setSpeak(Speak speak){
           this.speak=speak;
       }
    }
    

    依赖关系通过类构造函数被注入到 Person类中。控制流通过依赖注入(DI)已经“反转”,因为你已经有效地委托依赖关系到一些外部系统。

    • XML配置文件注入
     <bean id="person" class="com.example.Person">
          <constructor-arg ref="speak"/>
    </bean>
    <!-- Definition for speak bean -->
    <bean id="speak" class="com.example.Speak">
    </bean>
    
    Spring 基于设值函数的依赖注入

    当容器调用一个无参的构造函数或一个无参的静态 factory 方法来初始化你的 bean 后,通过容器在你的 bean 上调用设值函数,基于设值函数的 DI 就完成了。

     <bean id="person" class="com.example.Person">
          <property name="speak" ref="speak">
    </bean>
    <!-- Definition for speak bean -->
    <bean id="speak" class="com.example.Speak">
    </bean>
    
    • Tip:此方法和构造函数注入唯一的区别就是在基于构造函数注入中,我们使用的是标签中的元素,而在基于设值函数的注入中,我们使用的是标签。

    • tip:如果你要把一个引用传递给一个对象,那么你需要使用 标签的 ref 属性,而如果你要直接传递一个值,那么你应该使用 value 属性。

    p-namespace
    <bean id="test" class="com.example.Person">
          <property name="name" value="swift"/>
          <property name="method" ref="speak"/>
    </bean>
    //可以通过如下方式简化表示
    <bean id="test" class="com.example.Person"
          p:name="swift"
          p:method="speak"/>
    </bean>
    
    注入内部bean

    inner bean是在bean类中添加的内部类(java内部类)

    <bean id="person" class="com.sunxiaohang.Person">
            <property name="speak">
                <bean id="speak" class="com.sunxiaohang.Speak"></bean>
            </property>
    </bean>
    

    tip:``

    Spring注入集合
    Spring集合类
    Map
    Properties
    Set
    List

    Spring提供了四种集合类

    Spring集合类
    Map
    Properties
    Set
    List

    以下是Collections类和springbean.xml的配置代码

    package com.sunxiaohang;
    
    import java.util.List;
    import java.util.Map;
    import java.util.Properties;
    import java.util.Set;
    
    public class Collections {
        private Set collectionSet;
        private Map collectionMap;
        private Properties collectionProperties;
        private List collectionList;
    
        public Collections() {
        }
    
        public Set getCollectionSet() {
            System.out.println("Set Element:"+collectionSet);
            return collectionSet;
        }
    
        public void setCollectionSet(Set collectionSet) {
            this.collectionSet = collectionSet;
        }
    
        public Map getCollectionMap() {
            System.out.println("Map Element:"+collectionMap);
            return collectionMap;
        }
    
        public void setCollectionMap(Map collectionMap) {
            this.collectionMap = collectionMap;
        }
    
        public Properties getCollectionProperties() {
            System.out.println("Properties Element:"+collectionProperties);
            return collectionProperties;
        }
    
        public void setCollectionProperties(Properties collectionProperties) {
            this.collectionProperties = collectionProperties;
        }
    
        public List getCollectionList() {
            System.out.println("list Element:"+collectionList);
            return collectionList;
        }
    
        public void setCollectionList(List collectionList) {
            this.collectionList = collectionList;
        }
    }
    
    
    <bean id="collections" class="com.sunxiaohang.Collections">
        <property name="collectionList">
            <list>
                <value>张三</value>
                <value>李四</value>
                <value>王五</value>
                <value>马六</value>
            </list>
        </property>
        <property name="collectionSet">
            <set>
                <value>北京</value>
                <value>天津</value>
                <value>上海</value>
                <value>广州</value>
            </set>
        </property>
        <property name="collectionMap">
            <map>
                <entry key="1" value="one"/>
                <entry key="2" value="two"/>
                <entry key="3" value="three"/>
                <entry key="4" value="four"/>
            </map>
        </property>
        <property name="collectionProperties">
            <props>
                <prop key="1">姓名</prop>
                <prop key="2">性别</prop>
                <prop key="3">年龄</prop>
                <prop key="4">出生日期</prop>
            </props>
        </property>
    </bean>
    

    我的文章列表

    相关文章

      网友评论

          本文标题:Spring继承与依赖注入-three

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