• Spring:(二)DI依赖注入方式


    DI 依赖注入

      DI(Dependency Injection)依赖注入,说简单一点就将类里面的属性在创建类的过程中给属性赋值,即将对象依赖属性(简单值,集合,对象)通过配置设值给该对象。

      

    属性注入的方式

    •  构造方法的方式
    •  set方法的方式
    •  工厂方法注入

      主要学习前两种方式

    构造方法的方式

      当是构造方法时注入Bean的属性值(简单值,集合,对象)

      利用<constructor-arg>标签进行属性的注入

        name:被设置属性的名

        value:被设置属性的值

     编写用构造方法的pojo

     1 package spring_test1.pojo;
     2 
     3 public class UserConstructor {
     4     private String name;
     5     private int id;
     6     
     7     public UserConstructor(String name, int id) {
     8         super();
     9         this.name = name;
    10         this.id = id;
    11     }
    12 
    13     @Override
    14     public String toString() {
    15         return "User_constructor [name=" + name + ", id=" + id + "]";
    16     }
    17 }

    XML配置编写

    <?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">
            
            <!-- Spring构造方法注入 -->
            <bean name="user_cons"  class="spring_test1.pojo.UserConstructor">
                <constructor-arg name="name" value="Roy"/>
                <constructor-arg name="id" value="1001"/>
            </bean> 
            
    </beans>

    编写测试类

     1 package spring_test1.test;
     2 
     3 import static org.junit.Assert.*;
     4 
     5 import org.junit.Test;
     6 import org.springframework.context.ApplicationContext;
     7 import org.springframework.context.support.ClassPathXmlApplicationContext;
     8 
     9 import spring_test1.pojo.UserConstructor;
    10 
    11 public class UserConstructorTest {
    12 
    13     @Test
    14     public void test() {
    15         //创建Spring的工厂
    16         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    17         //得到User对象
    18         UserConstructor userConstructor = (UserConstructor) applicationContext.getBean("user_cons");
    19         System.out.println(userConstructor);
    20     }
    21 }

    运行结果

    set方法的方式

       我在Spring:(一)那一篇中的第一个Spring程序便是set方法时的属性注入方式

      利用<property>标签

        name:被设置属性的名

        value:被设置属性的值

    标准XML格式

    编写pojo

     1 package spring_test1.pojo;
     2 
     3 /**
     4  * @author jyroy
     5  *
     6  */
     7 public class User {
     8     private String name;
     9     private int id;
    10     
    11     public String getName() {
    12         return name;
    13     }
    14     public void setName(String name) {
    15         this.name = name;
    16     }
    17     public int getId() {
    18         return id;
    19     }
    20     public void setId(int id) {
    21         this.id = id;
    22     }
    23     @Override
    24     public String toString() {
    25         return "User [name=" + name + ", id=" + id + "]";
    26     }
    27 }

    编写XML配置文件

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:p="http://www.springframework.org/schema/p"
     4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     5     xsi:schemaLocation="
     6             http://www.springframework.org/schema/beans
     7              http://www.springframework.org/schema/beans/spring-beans.xsd">
     8         
     9         <!--Spring的set方法的属性注入-->
    10         <bean name="user"  class="spring_test1.pojo.User">
    11             <property name="name" value="李东"/>
    12             <property name="id" value="1007" />
    13         </bean> 
    14 
    15         
    16 </beans>

    编写测试类

     1 package spring_test1.test;
     2 
     3 import org.junit.Test;
     4 import org.springframework.context.ApplicationContext;
     5 import org.springframework.context.support.ClassPathXmlApplicationContext;
     6 
     7 import spring_test1.pojo.User;
     8 
     9 public class UserTest {
    10     
    11     @Test
    12     public void demo1() {
    13         //创建Spring的工厂
    14         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    15         //得到User对象
    16         User user = (User) applicationContext.getBean("user");
    17         System.out.println(user);
    18     }
    19 }

     运行结果

    p命名空间的方式

      看上面的XML配置,似乎用<property/>标签还是比较臃肿。

      于是从2.0开始,Spring支持使用名称空间的可扩展配置格式。这些名称空间都是基于一种XML Schema定义。p命名空间就可以用bean 元素的属性代替<property/>元素。

      还需要在使用p命名空间时先声明使用对应的命名空间,即在bean元素上添加 xmlns:p="http://www.springframework.org/schema/p"

    1         <!-- p命名空间的方式 -->
    2         <bean id="user" class="spring_test1.pojo.User" p:name="Roy" p:id="1004"></bean>

    c命名空间的方式

      C命名空间与p命名空间类似,但是使用c命名空间可以用内联的构造参数代替嵌套的constructor-arg元素

      同样先声明使用对应的命名空间,即在bean元素上添加 xmlns:c="http://www.springframework.org/schema/c"

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:c="http://www.springframework.org/schema/c"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- 标准XML格式 -->
        <bean id="foo" class="x.y.Foo">
            <constructor-arg name="bar" ref="bar"/>
            <constructor-arg name="baz" ref="baz"/>
            <constructor-arg name="email" value="foo@bar.com"/>
        </bean>
    
        <!-- c命名空间格式 -->
        <bean id="foo" class="x.y.Foo" c:bar-ref="bar" c:baz-ref="baz" c:email="foo@bar.com"/>
    
        <!-- 还可以使用c命名空间的参数索引格式 -->
        <bean id="foo" class="x.y.Foo" c:_0-ref="bar" c:_1-ref="baz" c:_2="foo@bar.com"/>
    
    </beans>

    SpEL表达式方式

      Spring 表达式语言 (Spring Expression Language),打算整理完整的一篇

    集合类型属性注入

     1         <bean id="collectionBean" class="com.roy.spring.demo5.CollectionBean">
     2             <!-- 数组类型 -->
     3             <property name="arrs">
     4                 <list>
     5                     <value>数组一</value>
     6                     <value>数组二</value>
     7                 </list>
     8             </property>
     9             <!-- 注入list集合类型 -->
    10             <property name="list">
    11                 <list>
    12                     <value>list一</value>
    13                     <value>list二</value>
    14                 </list>
    15             </property>
    16 
    17             <!-- 注入set集合类型-->
    18             <property name="set">
    19                 <set>
    20                     <value>set一</value>
    21                     <value>set二</value>
    22                 </set>
    23             </property>
    24             
    25             <!-- 注入Map集合 -->
    26             <property name="map">
    27                 <map>
    28                     <entry key="aaa" value="111"></entry>
    29                     <entry key="bbb" value="222"></entry>
    30                     <entry key="ccc" value="333"></entry>
    31                 </map>
    32             </property>
    33             
    34             <!-- 注入property集合 -->
    35             <property name="properties">
    36                 <props>
    37                     <prop key="key1">value1</prop>
    38                     <prop key="key2">value2</prop>
    39                     <prop key="key3">value3</prop>
    40                 </props>
    41             </property>
    42         </bean>
  • 相关阅读:
    企业架构研究总结(38)——TOGAF架构能力框架之架构能力建设和架构治理
    企业架构研究总结(37)——TOGAF企业连续体和工具之架构资源库及架构工具的选择
    企业架构研究总结(36)——TOGAF企业连续体和工具之企业连续体构成及架构划分
    SQL高级查询——50句查询(含答案) ---参考别人的,感觉很好就记录下来留着自己看。
    致不想奋斗的女人们
    16-Angular中的动画
    15-Angular的路由
    14-Angular供应商和自定义服务
    13-$location以及$interpolate等服务
    12-Angular的http与location
  • 原文地址:https://www.cnblogs.com/jyroy/p/10304533.html
Copyright © 2020-2023  润新知