IOC 控制反转
标签: ioc控制反转
2023-03-23 21:16:27 153浏览
文章目录
一.IOC概念
IOC:控制反转,是一个理论,概念,思想。
描述的:把对象的创建,赋值,管理工作都交给代码之外的容器实现,也就是对象的创建是有其它外部资源完成。
控制:创建对象,对象的属性赋值,对象之间的关系管理。
反转:把原来的开发人员管理,创建对象的权限转移给代码之外的容器实现。由容器代替开发人员管理对象。创建对象,给属性赋值。
正转:由开发人员在代码中,使用new 构造方法创建对象,开发人员主动管理对象。
容器:是一个服务器软件,一个框架(spring)
为什么要使用ioc:目的就是减少对代码的改动,也能实现不同的功能。实现解耦合。
二. IOC的体现
servle是Tomcat服务器创建的。Tomcat也称为容器
Tomcat作为容器:里面存放的有servlet对象,Listener,Filter对象
三.ioc的技术实现
DI是ioc的技术实现
DI:依赖注入,只需要在程序中提供要使用的对象的名称就可以,至于对象如何在容器中创建,赋值,查找都由容器内部实现。
spring使用的di实现了ioc的功能,spring底层创建对象,使用的是反射机制。
spring是一个容器,管理对象,给属性赋值,底层是反射创建对象。
spring默认创建对象的时间:在创建spring的容器时,会创建配置文件中的所有的对象
spring创建对象:默认调用的是无参数构造方法
三.基于XML的DI
di的实现有两种:
1.在spring的配置文件中,使用标签和属性完成,叫做基于XML的di实现
2.使用spring中的注解,完成属性赋值,叫做基于注解的id实现
di的语法分类:
1.set注入(设置注入):spring要调用类的set方法,在set方法可以实现属性的赋值。(80左右都是使用的set注入)
2.构造注入,spring调用类的有参数构造方法,创建对象。在构造方法中完成赋值。
简单类型:spring中规定Java的基本数据类型和string都是简单类型
di给属性赋值:
1.set注入(赋值):spring调用类的set方法,set方法中完成属性赋值
(1)简单类型的set注入
<bean id="xx" class="yyy">
<property name="属性名字" value="此属性的值"/>
一个property只能给一个属性赋值
<property.....>
</bean>
(2)引用类型的set注入:spring调用类的set方法
<bean id="xxx" class="yyy">
<property name="属性名称" ref="bean的id“(对象的名称)/>
<bean/>
2.构造注入:spring调用类的有参数构造方法,在创建对象的同时,在构造方法中给属性赋值
构造注入使用<constructor-arg>标签:一个<constructor-arg>表示构造方法的一个参数
属性:
name:表示构造方法的形参名
index:表示构造方法的参数的位置,参数从左往右是0,1,2的顺序
value:构造方法的形参类型是简单类型的,使用value
ref:构造方法的形参类型是引用类型的,使用ref
1.引用类型属性自动注入
引用类型的自动注入:spring框架根据某些规则可以给引用类型赋值。不用你再给引用类型赋值
使用的规则常用的是byName,byType
1.byName(按名称注入):java类中引用类型的属性名和spring容器中(配置文件)的id名称一样。且数据类型是一致的,这样的容器中的bean,spring能够赋值给引用类型。
语法:
<bean id="xx" class="yyy" autowire="byName">
简单类型属性赋值
<bean/>
2.byType(按类型注入):Java类中引用类型的数据类型和spring容器中(配置文件)class属性是同源关系的,这样的bean能够赋值给引用类型
同源就是一类的意思:
①Java类中引用类型的数据类型和beanb的class的值是一样的。
②Java类中引用类型的数据类型和bean的class的值是父子类关系的。
③Java类中引用类型的数据类型和bean的class的值是接口和实现类关系的。
语法
<bean id="xx" class="yyy" autowire="byType">
简单类型属性赋值
<bean/>
注意:在byType中,在xml配置文件中声明bean只能有一个符合条件的,多余一个是错误的。
四.包含关系的配置文件
spring-total表示主配置文件:包含其它的配置文件的,主配置文件一般是不定义对象的。
语法:
<import rescourse="其它配置文件的路径"/>
关键字:“classpath”:表示类路径(class文件所在的目录),在spring的配置文件中要指定其它文件的位置,需要使用classpath,告诉spring到哪去加载读取文件
五.基于注解的DI
概念:通过注解完成Java对象创建,属性赋值
使用注解的步骤:
1.加入maven依赖 spring-context,在加入spring-context的同时,间接加入spring-aop依赖。
使用注解必须使用spring-aop依赖
2.在类中加入spring的注解(多个不同功能的注解)
3.在spring的配置文件中,加入一个组件扫描器的标签,说明注解在项目中的位置
(1)@Component:创建对象的,等同于bean的功能
属性:value就是对象的名称,也就是bean的id值,value的值是唯一的,创建的对象在整个spring的容器中就一个
位置:在类的上面
声明组件扫描器,组件就是Java对象
base-package:指定注解在你的项目中的包名
component-scan的工作方式:spring会扫描遍历base-package指定的包
把包中和子包中的所有类,找到类中的注解,按照注解的功能创建对象,或给属性赋值。
三种方法:
spring中和@Component功能一致,创建对象的注解还有:
1.@Repository(用在持久类层的上面):放在dao的实现类上面,表示创建dao对象,dao对象是能访问数据库的
2.Service(用在业务层类的上面):放在Service的实现类上面,创建Service对象,service对象是做业务处理,可以有事务等功能的。
3.@Controller(用在控制器的上面):放在控制器(处理器)类的上面,创建控制器对象的,控制器对象,能够接受用户提交的参数,显示请求的处理结果。
以上三个注解的使用语法和@Component一样的。都能创建对象,但是这三个注解还有额外的功能,给项目的对象分层
包的多个指定方式:
五.简单类型的属性赋值
1.@vaule(简单类型的属性赋值)
属性:value是String类型的,表示简单类型的属性值
位置:1.在属性定义的上面,无需set方法,推荐使用
2.在set方法的上面
2.自动注入
@Autowired:spring框架提供的注解,实现引用类型的赋值。
spring类中通过注解给引用类型赋值,使用的是自动注入原理,支持byName,bytype
@autowired:默认使用的是byType
属性:required,是一个Boolean类型,默认true
required=true:表示引用类型如果赋值失败,程序报错,并中止执行
required=false:引用类型如果赋值失败,程序正常进行,引用类型是null
位置:①属性定义的上面,无需set方法,推荐使用 ②在set方法的上面
使用byType:
使用byName
1.在属性上面加上@Autowired
2.在属性上面加入@Qualifier(value="bean的id):表示使用指定名称的bean完成赋值
@Resource:来自jdk中的注解,spring框架提供了对这个注解的功能支持,可以使用它给
引用类型赋值使用的也是自动注入的原理,支持byType,byName
默认是byName:先使用byName自动注入,如果byName赋值失败,再使用byType
位置:
1.在属性定义的上面,无需set方法,推荐使用
2.在set方法的上面
3.@Resource只使用byName方式,需要增加一个属性name
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论