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

package spring_test1.pojo;

/**
 * @author jyroy
 *
 */
public class User {
    private String name;
    private int id;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", id=" + id + "]";
    }
}

编写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的set方法的属性注入-->
        <bean name="user"  class="spring_test1.pojo.User">
            <property name="name" value="李东"/>
            <property name="id" value="1007" />
        </bean> 

</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="[email protected]"/>
    </bean>

    <!-- c命名空间格式 -->
    <bean id="foo" class="x.y.Foo" c:bar-ref="bar" c:baz-ref="baz" c:email="[email protected]"/>

    <!-- 还可以使用c命名空间的参数索引格式 -->
    <bean id="foo" class="x.y.Foo" c:_0-ref="bar" c:_1-ref="baz" c:_2="[email protected]"/>

</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>

原文地址:https://www.cnblogs.com/jyroy/p/10304533.html

时间: 2024-11-03 22:43:56

Spring:(二)DI依赖注入方式的相关文章

【Spring】DI 依赖注入传递参数的方式

DI依赖注入传入参数的方式,这里介绍了基本数据类型,集合,符合数据类型的传递(String类型比较特殊,其传递值和基本数据类型的方法一致) 注入基本数据类型和String类型 通过setter方法注入基本数据类型与String 案例: <bean id="book" class="cn.xdl.bean.Book"> <!-- 对于基本数据类型 与 String的注入操作 通过set方法 ,完成注入 name: 属性的名称 value: 属性要赋的

spring四种依赖注入方式

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是"控制反转",通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. spring有多种

spring 四种依赖注入方式以及注解注入方式

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化, 而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员, 而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. spring有多种依赖注

spring四种依赖注入方式 (set,构造器,工厂,注解 )

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是"控制反转",通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. spring有多种

Spring学习——DI(依赖注入)

IOC容器,处理对象依赖关系 IOC与DI: IOC :是一个容器,创建对象的容器 DI :在容器创建对象后,处理对象的依赖关系,也叫依赖注入! 方式1:通过set方法注入值 可以给普通属性.集合属性注入值: 1. 必须提供set方法 2. 配置中通过bean的property子节点,给对象属性注入值: 1 <!-- 2 依赖注入,即处理对象的依赖关系!给对象的属性设置值! 3 --> 4 <!-- 1) 给对象属性赋值(通过构造函数)--> 5 <bean id="

spring学习笔记-依赖注入

学习过程访问的地址,按顺序理解: [email protected]注解与自动装配 spring四种依赖注入方式 Spring注解注入 <context:component-scan>使用说明 详细:Spring零配置通过注解实现Bean依赖注入总结

spring框架学习(二)依赖注入

转自:http://blog.csdn.net/lishuangzhe7047/article/details/20740835 ———————————————————————————————————————————— spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入.接口注入不作要求,下面介绍前两种方式. 1,set注入 采用属性的set方法进行初始化,就成为set注入. 1)给普通字符类型赋值. [java] view plaincopyprint? pub

【SSH系列】深入浅出spring IOC中三种依赖注入方式

spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控制什么?依赖注入和控制反转是一样的概念吗?接触新的知识,小编的脑袋中全是大大的问号,不过没有关系,今天这篇博文,小编主要来简单的介绍一下在spring IOC中依赖注入的方法. 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性.我们可以从以下几个方面理解: a.参与者都

初识Spring框架实现IOC和DI(依赖注入)

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是什么 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想. 在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转