Spring_IOC控制反转和DI依赖注入

Posted 奔跑的路奇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring_IOC控制反转和DI依赖注入相关的知识,希望对你有一定的参考价值。

概念

IOC控制反转

控制反转即IOC ,它将开发者创建对象的权交给容器,通过容器来实现对象的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移。
Ioc和DI是同一个概念的不同角度描述。IoC是一种思想,概念,DI是实现它的手段。Spring框架使用依赖注入实现IoC.

基于XML的DI

di:依赖注入,表示创建对象,给属性赋值
di的实现语法有两种:
            1) 在spring的配置文件中使用标签和属性来完成,叫做基于xml的di实现
            2) 使用spring中的注解 ,完成属性赋值,叫做基于注解的di实现
di的语法分类:
            1)set注入(设值注入):spring调用类的set方法,在set方法中实现属性赋值。(使用较多)
            2)构造注入,spring调用类的有参数构造方法,创建对象,在构造方法中完成赋值

  实现步骤:
    1)创建maven的项目
    2)加入相对于的依赖
    3)创建类
        和没有使用框架一样,就是普通类
    4)创建spring需要使用的配置文件
        声明类的信息,这些类由spring创建和管理
        通过spring的语法,完成属性的赋值
    5)测试spring创建的对象

1:通过set方法
set 注入也叫设值注入是指,通过 setter 方法传入被调用者的实例。
示例:

<!--    声明Student对象
        di:给属性赋值
            1)简单类型的set注入(设值注入):(**)spring调用类的set方法,在set方法中实现属性赋值
                    语法:  <bean id="xx"> class="yy">
                                <property name="属性名字" value="此属性的值"/>
                            </bean>
            2)引用类型的set注入:spring调用类的set方法
                    语法:  <bean id="xx"> class="yy">
                                <property name="属性名字" ref="bean的id(对象的名称)"/>
                            </bean>
-->
    <bean id="myStudent" class="com.ziJie.ba02.Student">
        <property name="name" value="鹿晗"/> <!--调用了setName("鹿晗")-->
        <property name="age" value="30"/> <!--调用了setAge(20)-->
        <!--引用类型赋值-->
        <property name="school" ref="mySchool"/>
    </bean>
    
<!--    声明School对象-->
    <bean id="mySchool" class="com.ziJie.ba02.School">
        <property name="name" value="浙大"/>
        <property name="address" value="浙江"/>
    </bean>

2:通过构造方法
构造注入是指,在构造调用者实例的同时,完成被调用者的实例化。使用构造器设置依赖关系。

3:自动注入
根据自动注入判断标准的不同,可以分为两种:

  • byName:根据名称自动注入
  • byType: 根据类型自动注入

byName
当配置文件中被调用者 bean 的 id 值与代码中调用者 bean 类的属性名相同时,可使用byName 方式,让容器自动将被调用者 bean 注入给调用者 bean。容器是通过调用者的 bean类的属性名与配置文件的被调用者 bean 的 id 进行比较而实现自动注入的。

byType
使用 byType 方式自动注入,要求:配置文件中被调用者 bean 的 class 属性指定的类,要与代码中调用者 bean 类的某引用类型属性类型同源。即要么相同,要么有 is-a 关系(子类,或是实现类)。但这样的同源的被调用 bean 只能有一个。多于一个,容器就不知该匹配哪一个了。

基于注解实现IOC–重要

1:声明Bean的注解
在类上添加注解@Component表示该类创建对象的权限交给Spring容器。注解的value属性用于指定bean的id值,value可以省略。
@Component 不指定 value 属性,bean 的 id 是类名的首字母小写。

Spring中还提供了其他3个用于创建对象的注解:

@Repository : 用于dao实现类的的注解
@Service: 用户service实现类的注解
@Controller: 用于controller实现类的注解

这三个注解与@Component 都可以创建对象,但这三个注解还有其他的含义,
	@Service:创建业务层对象,业务层对象可以加入事务功能,
	@Controller: 注解创建的对象可以作为处理器接收用户的请求。
	@Repository : dao层的注解,bean 的 id 是类名的首字母小写。

@Repository,@Service,@Controller 是对@Component 注解的细化,
标注不同层的对象。即持久层对象,业务层对象,控制层对象。

2:包扫描
需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。如果没有报扫描,添加的创建对象的注解不生效。
三种方式:

  • 1 使用多个context:component-scan指定不同的包路径
<!--    声明组件扫描器,使用注解方式-->
    <context:component-scan base-package="com.ziJie.dao"/>
    <context:component-scan base-package="com.ziJie.service"/>
    <context:component-scan base-package="com.ziJie.controller"/>
  • 2 指定 base-package的值使用分隔符
    分隔符可以使用逗号(,)分号(;)还可以使用空格,不建议使用空格。
<context:component-scan base- package="com.ziJie.dao,com.ziJie.service,com.ziJie.controller"></context:component- scan>          
  • 3 base-package是指定到父包名
    base-package 是基本包,容器启动会扫描包及其子包中的注解,当然也会扫描到子包下级的子包。所以 base-package 可以指定一个父包就可以。但不建议使用顶级的父包,扫描的路径比较多,导致容器启动时间变慢。
<!--多个包的扫描: 方式3: base-package中直接声明要扫描的多个包的父包--> 
<context:component-scan base-package="com.kkb"></context:component-scan>     

自动注入@Resource

Spring提供了对 jdk中@Resource注解的支持。@Resource 注解既可以按名称匹配Bean,也可以按类型匹配 Bean。默认是按名称注入。使用该注解,要求 JDK 必须是 6 及以上版本。@Resource 可在属性上,也可在 set 方法上。
1、byType注入引用类型属性
@Resource 注解若不带任何参数,采用默认按名称的方式注入,按名称不能注入 bean,则会按照类型进行 Bean 的匹配注入。
2、byName注入引用类型属性
@Resource 注解指定其 name 属性,则 name 的值即为按照名称进行匹配的 Bean 的 id。

最后,如果有问题,希望指正,一起进步。

以上是关于Spring_IOC控制反转和DI依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

控制反转(IOC)和依赖注入(DI)的区别

PHP 依赖注入(DI) 和 控制反转(IoC)

如何理解 PHP的依赖注入(DI) 和 控制反转(IoC)

控制反转(IOC)和依赖注入(DI)的区别

spring IOC(控制反转)及DI(依赖注入)

Spring-DI控制反转和IOC依赖注入