三、DI依赖注入

1、什么是DI依赖注入?

  spring动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

  简单来说什么是依赖注入,就是给属性赋值(包括基本数据类型和引用数据类型)

回到顶部

2、利用 set 方法给属性赋值

  第一步:创建工程,并导入相应的 jar 包

  第二步:创建实体类 Person


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

package com.ys.di;

import java.util.List;

import java.util.Map;

import java.util.Properties;

import java.util.Set;

public class Person {

    private Long pid;

    private String pname;

    private Student students;

    private List lists;

    private Set sets;

    private Map maps;

    private Properties properties;

    

    public Long getPid() {

        return pid;

    }

    public void setPid(Long pid) {

        this.pid = pid;

    }

    public String getPname() {

        return pname;

    }

    public void setPname(String pname) {

        this.pname = pname;

    }

    public Student getStudents() {

        return students;

    }

    public void setStudents(Student students) {

        this.students = students;

    }

    public List getLists() {

        return lists;

    }

    public void setLists(List lists) {

        this.lists = lists;

    }

    public Set getSets() {

        return sets;

    }

    public void setSets(Set sets) {

        this.sets = sets;

    }

    public Map getMaps() {

        return maps;

    }

    public void setMaps(Map maps) {

        this.maps = maps;

    }

    public Properties getProperties() {

        return properties;

    }

    public void setProperties(Properties properties) {

        this.properties = properties;

    }

    

}

  我们看到这个实体类包括引用类型 Student 类,基本数据类以及集合数据类型。

  第三步:在 applicationContext.xml 中进行赋值


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

<!--

    property是用来描述一个类的属性

    基本类型的封装类、String等需要值的类型用value赋值

    引用类型用ref赋值

-->

<bean id="person" class="com.ys.di.Person">

    <property name="pid" value="1"></property>

    <property name="pname" value="vae"></property>

    <property name="students">

        <ref bean="student"/>

    </property>

    

    <property name="lists">

        <list>

            <value>1</value>

            <ref bean="student"/>

            <value>vae</value>

        </list>

    </property>

    

    <property name="sets">

        <set>

            <value>1</value>

            <ref bean="student"/>

            <value>vae</value>

        </set>

    </property>

    

    <property name="maps">

        <map>

            <entry key="m1" value="1"></entry>

            <entry key="m2" >

                <ref bean="student"/>

            </entry>

        </map>

    </property>   

    

    <property name="properties">

        <props>

            <prop key="p1">p1</prop>

            <prop key="p2">p2</prop>

        </props>

    </property>  

    

</bean>

<bean id="student" class="com.ys.di.Student"></bean>

  第四步:测试


1

2

3

4

5

6

7

8

9

10

11

//利用 set 方法给对象赋值

    @Test

    public void testSet(){

        //1、启动 spring 容器

        //2、从 spring 容器中取出数据

        //3、通过对象调用方法

        ApplicationContext context =

                new ClassPathXmlApplicationContext("applicationContext.xml");

        Person person = (Person) context.getBean("person");

        System.out.println(person.getPname());//vae

    }

  

回到顶部

3、利用 构造函数 给属性赋值

  第一步:在实体类 Per‘son.java 中添加两个构造方法:有参和无参


1

2

3

4

5

6

7

//默认构造函数

    public Person(){}

    //带参构造函数

    public Person(Long pid,Student students){

        this.pid = pid;

        this.students = students;

    }

  第二步:在 applicationContext.xml 中进行赋值


1

2

3

4

5

6

7

8

9

10

11

12

13

<!-- 根据构造函数赋值 -->

    <!--

        index  代表参数的位置  从0开始计算

        type   指的是参数的类型,在有多个构造函数时,可以用type来区分,要是能确定是那个构造函数,可以不用写type

        value  给基本类型赋值

        ref    给引用类型赋值

      -->

    <bean id="person_con" class="com.ys.di.Person">

        <constructor-arg index="0" type="java.lang.Long" value="1">

        </constructor-arg>       

        <constructor-arg index="1" type="com.ys.di.Student" ref="student_con"></constructor-arg>

    </bean>

    <bean id="student_con" class="com.ys.di.Student"></bean>

  第三步:测试


1

2

3

4

5

6

7

//利用 构造函数 给对象赋值

    @Test

    public void testConstrutor(){

        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        Person person = (Person) context.getBean("person_con");

        System.out.println(person.getPid());//1

    }

  

  总结:

  1、如果spring的配置文件中的bean中没有<constructor-arg>该元素,则调用默认的构造函数

  2、如果spring的配置文件中的bean中有<constructor-arg>该元素,则该元素确定唯一的构造函数

原文地址:https://www.cnblogs.com/zhoanghua/p/9292253.html

时间: 2024-11-13 06:41:18

三、DI依赖注入的相关文章

Spring详解(三)------DI依赖注入

上一篇博客我们主要讲解了IOC控制反转,也就是说IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建.初始化.销毁等工作交给spring容器来做.那么创建对象的时候,有可能依赖于其他的对象,即类的属性如何赋值?这也是我们这篇博客讲解 Spring 另一个核心要点:DI依赖注入. PS:本篇博客源码下载链接:http://pan.baidu.com/s/1c2xVUDi密码:v1h3 1.什么是DI依赖注入? spring动态的向某个对象提供它所需要的其他对象.这一点

Spring学习三、Spring配置与DI依赖注入

五.Spring配置 5.1别名 <!-- 别名--> <alias name="user" alias="user2"/> 5.2 Bean的配置 <!-- id : bean的唯一标识符,相当于对象名 class : 全限定名 包名 + 类名 name : 也是别名,name可以同时起多个别名 --> <bean id="userT" class="cn.imut.pojo.User&quo

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

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

框架 day36 Spring3 入门,DI依赖注入,装配bean基于xml/注解, 整合Junit4,配置约束自动提示

1 什么是spring 1.1官网 spring.io 1.2介绍 Spring的核心是控制反转(IoC)和面向切面(AOP). IoC(Inverse of Control 反转控制) AOP(Aspect Oriented Programming 面向切面编程为内核) 简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架. *轻量级:依赖其他内容较小,使用资源消耗也少.对比:EJB 重量级 *分层:经典三层体系架构,spring 提供解决方案

DI 依赖注入之StructureMap框架

DI  依赖注入之StructureMap框架 一.简叙: structureMap只是DI框架中的其中之一. 二.安装: 三.使用: 原文地址:https://www.cnblogs.com/zlp520/p/9094730.html

大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC

原文:大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC   转发时请注明原创作者及地址,否则追究责任.原创:alunchen 在上一篇文章中,我们聊了很多关于定义的方面,比较孤燥,下面我们结合.Net Core聊一下依赖注入&控制反转. 三种对象生命周期 关于.Net Core中的容器,有三种对象的生命周期,这个从网上搜索也有大堆的资料.为了循序渐进,我们这里介绍一下. Transient 称为短暂,意思是需要使用时就创建一个新的对象.从容易层面讲,当从容器取出

DI 依赖注入之unity(mvc)

DI 依赖注入之unity(mvc) 一.nuget下载安装: 使用Nuget安装Unity.MVC 安装完成后会在~/App_Start/目录下自动生成UnityMvcActivator.cs和UnityConfig.cs文件 二.配置: 打开UnityConfig文件,修改RegisterTypes()方法的代码 public static void RegisterTypes(IUnityContainer container) { // NOTE: To load from web.co

DI 依赖注入之unity的MVC版本使用Microsoft.Practices.Unity1.2与2.0版本对比

DI 依赖注入之unity的MVC版本使用Microsoft.Practices.Unity1.2与2.0版本对比 参考:https://www.cnblogs.com/xishuai/p/3670292.html 参考:https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff660914(v=pandp.20)?redirectedfrom=MSDN#config_registerelement 必读: 在unity1.2中我们

谈谈php里的IOC控制反转,DI依赖注入

理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(Inversion of Control,缩写为IoC):是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度. 依赖注入(Dependency Injection,简称DI):DI是IOC的一种实现,表现为:在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的属