三、spring之DI注入2(注入引用类型)

标签: spring ioc` iDI spring加载顺序
6人阅读 评论(0) 收藏 举报
分类:

三、spring之DI注入2(注入引用类型)

一、3种DI注入方式


  1. 构造方式通过constructor-arg标签及其属性
    1)name:代表构造方法字段名
    2)ref:注入spring容器中对应id类的实

2.SET方式 注意:该实体类必须有对应构造方法

**通过property标签及其属性**
 **1)name**:代表构造方法字段名
 **2)ref:**注入spring容器中对应id类的实

3、接口注入(工厂方法注入)(基本不用)


4.自动注入autowire


通过bean的autowire属性及其对应值
1)、no不使用自动装配,需要程序员手动配置注入 这里说下id和name的区别,其实没啥区别,主要就是name可以使用特殊字符,而id不能,而日常使用中,也没谁会在name中设置,所以说两者没区别。
2)、byName 通过容器中的id,调用set方法,所以该类必须有对应set方法通过的bean的type来匹配进行注入,也就是bean的id。如:bean A有个属性master类型为org.springframework.beans.Conversion.class,master的setter方法就是setMaster,A设置了autowire=”byType”,那么Spring就会在容器中查找class类型为Conversion的bean通过setMaster方法注入到A中。如果有多个相同的class类型,则匹配报错
3)、byType 通过容器中的类型,调用set方法,所以该类必须有对应set方法
4)、constructor 通过构造方式,调用有参构造,所有该类必须有有参构造。与byType一样,如果存在多个bean类型为B或者C,则会抛出异常。但时与byType不同的是,如果在容器中找不到匹配的类的bean,将抛出异常,因为Spring无法调用构造函数实例化这个bean。
5)、default默认,即byType方式

<?xml version="1.0" encoding="UTF-8"?>
   <!-- 导入约束 :xsd -->
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd"

        >

    <!-- 配置service交给spring管理 autowire自动注入方式-->
    <bean id="userService" class="cn.it.demo.service.impl.UserServiceImpl" autowire="constructor" >
    </bean>

    <!-- 配置dao交给spring管理 set方式-->
    <bean id="userDao" class="cn.it.demo.dao.impl.UserDaoImpl">
        <property name="runner" ref="run"></property>
    </bean>
        <!-- 配置第三方类库QueryRunner交给spring管理 构造方式-->
    <bean id="run" class="org.apache.commons.dbutils.QueryRunner">
        <constructor-arg name="ds"  ref="ds"></constructor-arg>
    </bean>
    <!-- 配置第三方类库DataSource交给spring管理 -->
    <bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 基本元素赋值 -->
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql:///mybatisdb"></property>
    </bean>

</beans>

说明:IOC加载顺序(在存在DI注入时)
是按配置文件的先后顺序进行加载类和创建相应对象的(默认是单利模式),当遇到DI注入时,
·1.如果是GET方式注入,或者autowire的get形式即byTape,byName和默认,会先创建该对象,当注入类创建好后再进行set方式注入,创建需要创建的对象放入spring容器管理
2.如果是构造方式,或者autowire的构造形式,则需要等需要注入的对象加载并创建对象完成,再调用对应有参构造完成注入创建需要创建的对象放入spring容器管理
3.顺序总结如果有需要注入的对象未被创建,(set方式注入,会有限创建本对象,构造方式会需要直接扫描获得依赖对象再创建本对象),再去扫描spring会扫描文档将注入依赖链需要创建的对象依次创建出来,然后再继续顺序执行加载并创建其他对象放入容器管理

<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入约束 :xsd -->
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 对于初学者,我们可以采用最简单的方式,在不看源码的情况下,初步了解spring底层的执行流程或者方式 -->    

    <!-- 放入第1个干扰对象 -->
    <bean id="user1" class="cn.it.demo.domain.User">
    </bean>

    <!-- web层,他需要通过set方法注入userService -->
    <bean id="servlet" class="cn.it.demo.web.servlet">
        <property name="userService" ref="userService"></property>
    </bean>
    <!-- 放入第2个干扰对象 -->
    <bean id="user2" class="cn.it.demo.domain.User">
    </bean>

     <!-- 业务层,他需要通过构造方式注入userDao -->
    <bean id="userService" class="cn.it.demo.service.impl.UserServiceImpl">
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>
    </bean>
    <!-- 放入第3个干扰对象 -->
    <bean id="user3" class="cn.it.demo.domain.User">
    </bean>
    <!-- web层,他需要通过set方法注入userService -->
    <bean id="userDao" class="cn.it.demo.dao.impl.UserDaoImpl">
    </bean>

</beans>
执行顺序:
user
无参构造创建了servlet
无参构造创建了dao
有参构造创建了service
servlet执行了setService方法
user
user
查看评论

MySQL注入攻防技术内幕 第一部分

随着MySQL普及,发生MySQL注入、提权、入侵和最终长期控制系统事件时有发生,甚至潜入而混然不觉,鉴于此,本课程主要以防御为目标进行深入和充分地了解如何注入、提权和入侵网站,进而总结如何防御的目标,课程的目标也是对社区MySQL安全的贡献。
  • 2016年03月21日 12:17

spring四种依赖注入方式 ( 依赖注入DI+ 控制反转IOC的原理)

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程...
  • baoendemao
  • baoendemao
  • 2014-04-28 13:06:23
  • 2041

spring DI四种依赖注入方式

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程...
  • YINZONGCHAO
  • YINZONGCHAO
  • 2017-07-07 11:59:27
  • 313

关于Spring IOC (DI-依赖注入)你需要知道的一切

【版权申明】未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/54561302 出自...
  • javazejian
  • javazejian
  • 2017-01-19 16:46:27
  • 28197

Spring讲解----------依赖注入(DI)

3.1.1  依赖和依赖注入        传统应用程序设计中所说的依赖一般指“类之间的关系”,那先让我们复习一下类之间的关系:      泛化:表示类与类之间的继承关系、接口与接口之间的继承关系...
  • u011225629
  • u011225629
  • 2015-07-30 07:38:35
  • 2430

Helloworld之Spring依赖注入/控制反转(DI/IoC)版

Helloworld之Spring依赖注入/控制反转(DI/IoC)版 作者:雨水, 日期:2014-10-29 摘要:本文主要用于培训初学者理解Spring中的依赖注入的基本概念. ...
  • gobitan
  • gobitan
  • 2014-10-29 11:47:14
  • 1999

spring setter方法依赖注入(DI)原理

使用setter方法DI: beans.xml                    Bean1.java public class Bean1 {     private ...
  • yhcelebrite
  • yhcelebrite
  • 2013-05-20 20:31:55
  • 2644

spring容器DI依赖注入对象<三>

问题?Spring的DI讲解、DI有几种注入方式、 一、spring的DI:依赖注入给属性赋值 DI定义:一个对象类的属性可以使用springDI(依赖注入)来进行赋值,但是并不是所有的类属性...
  • Mr_li13
  • Mr_li13
  • 2015-12-02 20:32:00
  • 801

Spring常用的三种注入方式

Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入。构造方法注入先简单看一下测试项目的结构,用maven构建的,四个包:e...
  • a909301740
  • a909301740
  • 2017-10-28 21:45:39
  • 5697

Spring 引用注入setter

注入引用类型:对象        必须保障该对象以Bean形式存在于IoC容器,受Spring控制 1.      提供对应要注入的属性 public class Bean2User { pu...
  • hao947
  • hao947
  • 2014-06-17 22:20:08
  • 695
    个人资料
    等级:
    访问量: 56
    积分: 247
    排名: 33万+
    文章存档
    最新评论