Spring注入(Injection)——教你一点一点知道什么是依赖注入及注入方式

前言

在学习spring的时候有个很重的知识点,那就是注入,不同的注入方式为程序的运行效率,资源利用都有不同的好处,接下来就看看我通过看视频总结的注入。

一、引入注入

1.首先我们明确一个问题,什么注入?

        通过spring工厂及配置文件,为所创建对象的成员变量赋值。

我们在没有学习spring之前创建对象是通过在类里利用new关键进行创建,这样的方式大家都知道,耦合性比较高,不提倡这样做,但是在我们学习spring之后就知道了,在spring框架提供工厂,对程序员来说带来了很大的便利;

所以在这里,所谓注入就是通Spring工厂及配置文件,为所创建的对象的成员变量赋值。说白了就是对一个对象进行初始化,也就是省去了new这个步骤,类似工厂一样,让工厂去造对象。

2.为什么要注入?

      通过编码的方式,为成员变量赋值,这样存在耦合。

3.如何进行注入

类为成员变量提供get和set方法

配置spring的配置文件

 

通过这两步就完成了注入。

4.注入的好处:  最根本的就是解耦合,从上述代码中能看出,把创建对象的任务交给了工厂,减少了依赖。

       Spring注入原理分析 

        首先,要明确一个很重要的点:对于spring来说,它操作的是配置文件,它会把配置文件翻译成代码。

最开始它先读取bean标签中的account,通过account去读取class=xxxx,用来创建对象,其实就是底层的反射实现的,等效于调用构造函数。

  • bean标签等效于对象的创建
  • properties等效于调用属性的set方法来完成赋值。

spring通过底层调用独享属性对应的set方法,完成成员变量的赋值,这种方式我们称之为set注入。

二、注入方式

 set注入

针对于不同类型的成员变量,在<properties>中注入

1.JDK内置类型

    1.1Spring+8种基本类型

<value>yangyp</value>

    1.2数组

<list>
    <value>zhangsan@163.com</value>
    <value>lisi@163.com</value>
    <value>wangwu@163.com</value>
<list>

    1.3Set集合

<set>
    <value>11111</value>
    <value>12222</value>
</set>
<set>
    <ref bean
    <set
</set>

    1.4list集合

<list>
    <value>11111</value>
    <value>12222</value>
</list>
<set>
    <ref bean
    <set
</list>

    1.5 Map集合

注意:map---entry  ---key有特定的标签<key></key>

值根据对应类型选择对应类型的标签

<map>
   <entry>
       <key><value>zhangsan</value><key>
       <value>123456</value>
   </entry>
   <entry>
       <key><value>list</value><key>
       <ref bean
   </entry>
</map>

     1.6Properties

<props>
     <prop key="key1">value1</prop>
     <prop key="key2">value2</prop>
</props>

2.用户自定义类型

     第一种方式

     为成员变量提供set get 方法

<bean id="userService" class="xxxx.UserServiceImpl">
     <properties name="userDAO">               //userDAO  需要这个对象
          <bean class ="xxxx.UserDAOImpl"/>    //用bean标签创建对象
    </properties>
</bean>

第二种方式

 第一种赋值方式存在的问题

  •     配置文件代码冗余
  •     被注入的对象(UserDAO),多次创建,浪费(JVM)内存资源

配置文件中进行配置

<bean id="userDAO" class="xxx.UserDAOImpl">
    </bean>
<bean id="userService" class="xxx.UserServiceImpl">
     <property name="userDAO">            
         <ref bean="userDAO"/>      
         </property>
</bean>

ref引用,解决内存资源浪费的问题,很多个对象都可以引用这一个对象

3.set注入的简化写法

  3.1基于属性简化

  JDK类型注入

<property name="name">
     <value>zhangsan</value>
<property>
<property name="name" value=“zhangsan”/>

注意:value属性,只简化8种基本数据类型+String 注入标签

  3.2用户自定义类型

<property name="userDAO">
     <ref bean =“userDAO“/>
<property>
<property name="userDAO" ref="userDAO">

  3.3基本命名空间P简化(p代表property)

   JDK类型注入

<bean id="person" class="xxx.Person>
  <property name="name">
  <value>zhangsan</value>
<property>
<property name="name" value="zhangsan"/>

注意:value属性,只简化8种基本数据类型+String 注入标签

 3.4用户自定义类型

<bean id="userService" class="xxx.UserServiceImpl">
      <property name="userDAO">
          <ref bean ="userDAO"/>
      </property>
</bean> 
<bean id ="userService" class="xxx.UserServiceImpl" p:userDAO-ref="userDAO"/>

构造注入

  • 注入:通过Spring的配置文件,为成员变量赋值
  • Set注入:Spring调用Set方法,通过配置文件,为成员变量赋值
  • 构造注入:Spring调用构造方法,通过配置文件,为成员变量赋值。

    1.开发步骤

   提供有参的构造方法

Public class Customer{
    Private String name;
    Private int age;
    Public Customer (String name,int age){
    this.name=name;
    this.age=age;
    }
}

        Spring的配置文件

<bean id="customer" class="com.dmsd.mapper.contstructer.Customer">
    <constructor-arg>
        <value>zhangsan</value>
    </constructor-arg>
    <constructor-arg>
        <value>111</value>
    </constructor-arg>
</bean>

用构造方法正如上面有几个参数,就需要写几个<constructor-arg>标签。

2.构造方法重载

  2.1参数个数不同时

        通过控制<constructor-arg>标签的数量进行区分

  2.2构造参数个数相同时

通过在标签引入type属性,进行类型区分<constructor-arg type="">

 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 创作都市 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读