这里写目录标题
一、IOC简介
1.1 程序书写的目标
程序书写的目标就是高内聚,低耦合。内聚是形容一个模块的功能的,而耦合是形容多个模块间的关系的。一般而言实现了低耦合也就实现了搞内聚。
耦合只能说是降低耦合无法实现完全没有耦合,开发中模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形 式。了解了耦合的分类也就很容易理解耦合了。
1.2 IOC
- 控制饭庄,Spring反向控制应用程序所需要的外部资源。
- Spring控制的资源全部放置在容器中,该容器称为IOC容器。
二、入门案例分析
1、案例环境说明
-
模拟三层架构中表现层调用业务层功能
-
表现层:UserApp模拟UserServlet(使用main方法模拟)
-
业务层:UserService
-
2、IoC入门案例制作步骤
2.1导入spring坐标(5.1.9.release)
pom文件中引入依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
2.2.编写业务层(模拟)
package cn.study.service;
public class UserService {
public void save() {
System.out.println("user service running...");
}
}
2.3.建立spring配置文件
在resource文件夹下新建applicationContext.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="cn.study.service.UserService"/>
</beans>
.配置所需资源(Service)为spring控制的资源
2.4.表现层(App)通过spring获取资源(Service实例)
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();
}
}
ApplicationContext是Spring中的核心接口和容器,允许容器通过应用程序上下文环境创建、获取、管理bean。
在构建容器的时候,创建对象采用的策略是立即加载的方式,即只要一读取完配置文件就立即创建配置文件中配置的对象。
BeanFactory采用的是延迟加载的方式,什么时候根据id获取对象了,什么时候才真正地创建对象。
该接口具有三个常用的实现类:
- ClassPathXmlApplicationContext:可以加载类路径下的配置文件,要求配置文件必须在类路径之下。
- FileSystemXmlApplicationContext:可以加载磁盘中任意路径下的配置文件,要求具有访问权限。
- AnnotationConfigApplicationContext:用于读取注解创建容器。
三、IOC配置
1、bean
-
名称:bean
-
类型:标签
-
归属:beans标签
-
作用:定义spring中的资源,受此标签定义的资源将受到spring控制
-
格式:
<beans> <bean /> </beans>
-
基本属性:
<bean id="beanId" name="beanName1,beanName2" class="ClassName"></bean>
id:bean的名称,通过id值获取bean
class:bean的类型
name:bean的名称,可以通过name值获取bean,用于多人配合时给bean起别名
2、bean属性scope
-
名称:scope
-
类型:属性
-
归属:bean标签
-
作用:定义bean的作用范围
-
格式:
<bean scope="singleton"></bean>
-
取值:
- singleton:设定创建出的对象保存在spring容器中,是一个单例的对象
- prototype:设定创建出的对象保存在spring容器中,是一个非单例的对象
- request、session、application、 websocket :设定创建出的对象放置在web容器对应的位置
3、bean生命周期
-
名称:init-method,destroy-method
-
类型:属性
-
归属:bean标签
-
作用:定义bean对象在初始化或销毁时完成的工作
-
格式:
<bean init-method="init" destroy-method="destroy></bean>
-
取值:bean对应的类中对应的具体方法名
-
注意事项:
-
当scope=“singleton”时,spring容器中有且仅有一个对象,init方法在创建容器时仅执行一次
-
当scope=“prototype”时,spring容器要创建同一类型的多个对象,init方法在每个对象创建时均执行一次
-
当scope=“singleton”时,关闭容器会导致bean实例的销毁,调用destroy方法一次
-
当scope=“prototype”时,对象的销毁由垃圾回收机制gc()控制,destroy方法将不会被执行
-
4、bean对象创建方式
4.1、factory-bean
-
名称:factory-bean
-
类型:属性
-
归属:bean标签
-
作用:定义bean对象创建方式,使用静态工厂的形式创建bean,兼容早期遗留系统的升级工作
-
格式:
<bean class="FactoryClassName" factory-method="factoryMethodName"></bean>
-
取值:工厂bean中用于获取对象的静态方法名
-
注意事项:
- class属性必须配置成静态工厂的类名
4.2、factory-bean,factory-method
-
名称:factory-bean,factory-method
-
类型:属性
-
归属:bean标签
-
作用:定义bean对象创建方式,使用实例工厂的形式创建bean,兼容早期遗留系统的升级工作
-
格式:
<bean factory-bean="factoryBeanId" factory-method="factoryMethodName"></bean>
-
取值:工厂bean中用于获取对象的实例方法名
-
注意事项:
-
使用实例工厂创建bean首先需要将实例工厂配置bean,交由spring进行管理
-
factory-bean是实例工厂的beanId
-
4.3、静态工厂和实例工厂穿建bean的代码
工厂类代码
package cn.study.service;
public class UserServiceFactory1 {
public static UserService getService(){
System.out.println("UserServiceFactory1 create object...");
return new UserService();
}
}
package cn.study.service;
public class UserServiceFactory2 {
public UserService getService(){
System.out.println("UserServiceFactory2 create object...");
return new UserService();
}
}
applicationContext文件
<!-- 静态工厂创建bean -->
<bean id="userService1" class="cn.study.service.UserServiceFactory1" factory-method="getService"/>
<!--实例工厂对应的bean-->
<bean id="factoryBean" class="cn.study.service.UserServiceFactory2"/>
<!--实例工厂创建bean,依赖工厂对象对应的bean-->
<bean id="userService2" factory-bean="factoryBean" factory-method="getService" />
UserApp文件
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
/*UserService userService1 = (UserService) ctx.getBean("userService");
userService1.save();*/
UserService userService1 = (UserService) ctx.getBean("userService1");
userService1.save();
UserService userService2 = (UserService) ctx.getBean("userService2");
userService2.save();
}