IOC介绍
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中
耦合(Coupling):代码书写过程中所使用技术的结合紧密度,用于衡量软件中各个模块之间的互联程度
内聚(Cohesion):代码书写过程中单个模块内部各组成部分间的联系,用于衡量软件中各个功能模块内部的功能联系
程序书写的目标:高内聚,低耦合
就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度却不要那么紧密
实现方式
准备工作:maven项目引入spring依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
XML方式
1.创建service接口类
public interface UserService {
//业务方法
void save();
}
2.创建service实现类
public class UserServiceImpl implements UserService {
public void save() {
System.out.println("user service running...");
}
}
3.创建application.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 1.创建spring控制的资源-->
<bean id="userService" class="com.*.service.impl.UserServiceImpl"/>
</beans>
4.创建启动类
public class UserApp {
public static void main(String[] args) {
//2.加载配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//3.获取资源
UserService userService = (UserService) ctx.getBean("userService");
userService.save();
}
}
IOC配置
<bean>
作用:定义spring中的资源,受此标签定义的资源将受到spring控制
//代码样式:
<beans>
//基本属性
<bean id="beanId"
name="beanName1,beanName2"
class="ClassName"
scope="singleton"
init-method="init"
destroy-method="destroy">
</bean>
</beans>
id:bean的名称,通过id值获取bean
name: bean的名称,可以通过name值获取bean,用于多人配合时给bean起别名
class: bean类型 (bean对象的全路径)
scope:定义bean的作用域
取值:
singleton:设定创建出的对象保存在spring容器中,是一个单例的对象(默认)
prototype:设定创建出的对象保存在spring容器中,是一个非单例的对象
request、session、application、 websocket :设定创建出的对象放置在web容器对应的位置
init-method:定义bean对象初始化时完成工作
destroy-method:定义bean对象初销毁时完成工作
取值:bean对应类中的方法名
注意:
当scope=“singleton”时,spring容器中有且仅有一个对象,init方法在创建容器时仅执行一次
当scope=“prototype”时,spring容器要创建同一类型的多个对象,init方法在每个对象创建时均执行一次
当scope=“singleton”时,关闭容器会导致bean实例的销毁,调用destroy方法一次
当scope=“prototype”时,对象的销毁由垃圾回收机制gc()控制,destroy方法将不会被执行
DI
IoC(Inversion Of Control)控制翻转,Spring反向控制应用程序所需要使用的外部资源
DI(Dependency Injection)依赖注入,应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为注入
DI实现方式
准备:
public class test {
private PropertyName propertyName;
private test(PropertyName propertyName) {
this.propertyName = propertyName;
}
public setPropertyName (PropertyName propertyName) {
this.propertyName = propertyName;
}
}
- set注入法
//xml文件中
<bean id="test" class="*.test">
<property name="propertyName" value="propertyValue" ref="beanId"/>
</bean>
name:对应bean中的属性名,要求该属性必须提供可访问的set方法(严格规范为此名称是set方法对应名称)
value:设定非引用类型属性对应的值,不能与ref同时使用
ref:设定引用类型属性对应bean的id ,不能与value同时使用
- 构造器注入法
<bean id="test" class="*.test">
<constructor-arg name="argsName" value="argsValue />
或者
<constructor-arg index="arg-index" type="arg-type" ref="beanId"/>
</bean>
name:对应bean中的构造方法所携带的参数名
type :设定构造方法参数的类型,用于按类型匹配参数或进行类型校验
index :设定构造方法参数的位置,用于按位置匹配参数,参数index值从0开始计数
注意:一个bean可以有多个constructor-arg标签
value:设定非引用类型构造方法参数对应的值,不能与ref同时使用
ref:设定引用类型属性对应bean的id ,不能与value同时使用
properties文件
Spring提供了读取外部properties文件的机制,使用读取到的数据为bean的属性赋值
- 准备外部properties文件
2.开启context命名空间支持
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
//context命名空间
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
//context命名空间http地址
http://www.springframework.org/schema/context
https://www.springframework.org/schema/spring-context.xsd">
</beans>
- 加载指定的properties文件
<context:property-placeholder location="classpath:filename.properties">
- 使用加载的数据
<property name="propertyName" value="${propertiesName}"/>
<import>
作用:在当前配置文件中导入其他配置文件中的项
<beans>
<import resource=“config.xml"/>
</beans>
Spring容器中的bean定义冲突问题
- 同id的bean,后定义的覆盖先定义的
- 导入配置文件可以理解为将导入的配置文件复制粘贴到对应位置
- 导入配置文件的顺序与位置不同可能会导致最终程序运行结果不同
ApplicationContext
- ApplicationContext是一个接口,提供了访问spring容器的API
- ClassPathXmlApplicationContext是一个类,实现了上述功能
- ApplicationContext的顶层接口是BeanFactory
- BeanFactory定义了bean相关的最基本操作
- ApplicationContext在BeanFactory基础上追加了若干新功能
对比BeanFactory - BeanFactory创建的bean采用延迟加载形式,使用才创建
- ApplicationContext创建的bean默认采用立即加载形式
FileSystemXmlApplicationContext
可以加载文件系统中任意位置的配置文件,而ClassPathXmlApplicationContext只能加载类路径下的配置文件
网友评论