文档章节

Spring系列教程五: 依赖注入的方式详解

我叫小糖主
 我叫小糖主
发布于 05/15 23:53
字数 1209
阅读 20
收藏 2

依赖注入的概念

Spring中的依赖注入,称为dependency Injection,Ioc的作用降低程序之间的耦合,依赖关系管理交给Spring来维护,在当前类中需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明,依赖关系的维护,我们称之为依赖注入

依赖注入的三种数据

基本数据类型和String、其他bean类型(在配置文件中或者注解配置过的bean)、复杂类型/集合类型

依赖注入的三种方式

①使用构造函数  ②使用set方法提供   ③使用复杂类型注入/集合类型注入

构造函数注入

①目录结构,接口实现类中属性和方法

public class AccountServiceImpl implements IAccountService {
  
   //如果是经常变化的数据,并不适用于注册的方式
   private String name;
   private Integer age;
   private Date brithday;

   AccountServiceImpl(String name,Integer age,Date brithday){
       this.name=name;
       this.age=age;
       this.brithday=brithday;
   }

   public void saveAccount(){
       System.out.println("service中的saveAccount方法执行了...."+name+age+brithday);
   }
}

②修改配置文件

在配置文件中,用使用标签constructor-arg, 标签出现的位置bean标签内部

标签中属性 type:用于指定要注入的数据的数据类型,该数据也是构造函数中某个或者某些参数的类型,不能独立实现注入,index:用于指定注入的数据给构造函数中指定索引位置的参数赋值,索引的位置从0开始,需要记索引,name:用于给指定后遭函数中指定名称的参数赋值(常用的)
                                     =======================以上三个用于给构造函数中参数赋值=========================

value:用于给基本类型和Strig提供数据,ref:就是引用指定其他的bean数据,它指的就是在Spring Ioc核心容器出现过的bean对象如下

<bean id="accountService" class="com.ithema.jdbc.service.impl.AccountServiceImpl">
       <constructor-arg name="name" value="name"></constructor-arg>
       <constructor-arg name="age" value="20"></constructor-arg>
       <constructor-arg name="brithday" ref="now"></constructor-arg>
</bean>
<!--配置一个日期对象-->
<bean id="now" class="java.util.Date"></bean>

③测试实现类,运行代码得到以下结果,成功实现了依赖注入

package com.ithema.jdbc.ui;
import org.springframework.core.io.ClassPathResource;

import javax.annotation.Resource;

public class Client {
    public static void main(String[] args) {
    ApplicationContext ac=new ClassPathXmlApplicationContext("ApplicationContext.xml");
    IAccountService as= (IAccountService) ac.getBean("accountService");
    System.out.println(as);
    as.saveAccount();
}

 优势:在获取bean对象时候注入数据是必须的操作,否则对象无法创建成功      弊端:改变了bean对象的实例化方式,使我们在创建对象时候用不到这些数据也必须提供

set方式注入(是我们经常用的注入方式)

①在接口类中实现属性的set的方法

package com.ithema.jdbc.service.impl;

import com.ithema.jdbc.service.IAccountService;

import java.util.Date;

/**
 * 账户的业务层实现类
 */
public class AccountServiceImpl2 implements IAccountService {
   //如果是经常变化的数据,并不适用于注册的方式
    private String name;
    private Integer age;
    private Date brithday;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setBrithday(Date brithday) {
        this.brithday = brithday;
    }

   public void saveAccount(){
       System.out.println("service中的saveAccount方法执行了...."+"名字:"+name+"年纪:"+age+"生日:"+brithday);
   }
}

②配置文件中修改代码

<bean id="accountService2" class="com.ithema.jdbc.service.impl.AccountServiceImpl2">
        <property name="name" value="Test"></property>
        <property name="age" value="21"></property>
        <property name="brithday" ref="now"></property>
</bean>

③测试类的运行,得到以下结果

package com.ithema.jdbc.ui;
import org.springframework.core.io.ClassPathResource;

import javax.annotation.Resource;

public class Client {
    public static void main(String[] args) {
    ApplicationContext ac=new ClassPathXmlApplicationContext("ApplicationContext.xml");
    IAccountService as= (IAccountService) ac.getBean("accountService2");
    System.out.println(as);
    as.saveAccount();
}

使用set方法实现注入

优势:创建对象没有明确的限制,可以直接使用默认的构造函数   劣势:如果某个成员必须有值,则获取对象时候,set无法执行

 

复杂类型方式的注入

①接口实现类set方法

package com.ithema.jdbc.service.impl;

import com.ithema.jdbc.service.IAccountService;

import java.lang.reflect.Array;
import java.util.*;

/**
 * 账户的业务层实现类
 */
public class AccountServiceImpl3 implements IAccountService {
   //复杂类型注入/集合注入
    private String[] myStrs;
    private List<String> myList;
    private Map<String,String>myMap;
    private Properties myPro;

    public void setMyStrs(String[] myStrs) {
        this.myStrs = myStrs;
    }

    public void setMyList(List<String> myList) {
        this.myList = myList;
    }

    public void setMyMap(Map<String, String> myMap) {
        this.myMap = myMap;
    }

    public void setMyPro(Properties myPro) {
        this.myPro = myPro;
    }


   public void saveAccount(){
       System.out.println(Arrays.toString(myStrs));
       System.out.println(myList);
       System.out.println(myMap);
       System.out.println(myPro);
   }
}

②改变配置文件中的代码



    <bean id="accountService3" class="com.ithema.jdbc.service.impl.AccountServiceImpl3">
        <property name="myStrs">
            <array>
                <value>AAAA</value>
                <value>BBBB</value>
                <value>CCC</value>
            </array>
        </property>
        <property name="myList">
            <list>
                <value>AAA</value>
                <value>BBB</value>
                <value>CCC</value>
            </list>
        </property>
        <property name="myMap">
            <map>
                <entry key="test1" value="AA"></entry>
                <entry key="test2" value="BB"></entry>
                <entry key="test3" value="CC"></entry>
            </map>
        </property>
        <property name="myPro">
            <props>
                <prop key="test2">A</prop>
                <prop key="test1">B</prop>
                <prop key="test">C</prop>
            </props>
        </property>
    </bean>

③测试类的执行,执行的结果如下

package com.ithema.jdbc.ui;
import org.springframework.core.io.ClassPathResource;

import javax.annotation.Resource;

public class Client {
    public static void main(String[] args) {
    ApplicationContext ac=new ClassPathXmlApplicationContext("ApplicationContext.xml");
    IAccountService as= (IAccountService) ac.getBean("accountService3");
    System.out.println(as);
    as.saveAccount();
}

© 著作权归作者所有

我叫小糖主
粉丝 7
博文 48
码字总数 56467
作品 0
大渡口
私信 提问
Spring Boot 2 快速教程:WebFlux 集成 Thymeleaf(五)

号外:为读者持续整理了几份最新教程,覆盖了 Spring Boot、Spring Cloud、微服务架构等PDF。 获取方式:关注右侧公众号”泥瓦匠BYSocket”,来领取吧! 摘要: 原创出处 https://www.bysock...

01/31
0
0
Spring|Spring概述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/darlingwood2013/article/details/89374446 Spring|Spring概述 Spring 介绍 Spring 是一个分层的JavaSE/EE f...

叶晚林
04/19
0
0
三条路线告诉你如何掌握Spring IoC容器的核心原理

一、前言 前三篇已经从历史的角度和大家一起探讨了为什么会有Spring,Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国。本节的主要目的就是通过一个切入点带大家一...

Java小铺
2018/08/27
0
0
Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Nacos

上一篇我们介绍了如何通过改造Sentinel Dashboard来实现修改规则之后自动同步到Apollo。下面通过这篇,详细介绍当使用Nacos作为配置中心之后,如何实现Sentinel Dashboard中修改规则同步到N...

程序猿DD
05/22
0
0
1 Spring核心:IoC容器的实现

依赖控制反转的实现有很多种方式。在Spring中,IoC容器是实现这个模式的载体, 它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方...

qq_18150351
2018/04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
8
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
9
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
7
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
8
0
玩转Redis-Redis基础数据结构及核心命令

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用,文章基于Redis5.0.4+。本文主要讲述Redis的数据结构String,《玩转Redis-Redis基础数据结构及核心命令》相关操作命令为方便对比...

zxiaofan666
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部