Spring_IOC控制反转和DI依赖注入
Posted 奔跑的路奇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring_IOC控制反转和DI依赖注入相关的知识,希望对你有一定的参考价值。
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依赖注入的主要内容,如果未能解决你的问题,请参考以下文章