1.为什么要使用IOC?
仔细观察上图可以发现层与层之间存在依赖关系,在一个类里面创建(new)了另外一个类的对象。
使用IOC的目的就是为了解耦,缓解这种层与层之间的依赖关系
传统上我们都是使用new 的方式来直接创建对象,现在有了spring之后,我们就再也不new对象了,而是把对象创建的工作交给spring容器去维护。我们只需要问spring容器要对象即可。
2.实例展示
2.1首先给出结构图
记得引入依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
2.2 解耦过程分析
通过InstanceFactory去创建Service对象,我们再将InstanceFactory方法交给spring核心容器去管理即可。
2.3UserController.java
创建核心容器,使用spring的核心容器根据id获取对象
/**
* 1.引入依赖
* 2.创建spring的配置文件beans.xml
* 3.创建spring的核心容器
* 4.使用spring的核心容器根据id获取对象
*/
public class UserController {
public static void main(String[] args) {
//创建核心容器,要指定要读取的配置文件(spring框架)
ApplicationContext act=new ClassPathXmlApplicationContext("beans.xml");
//没有交给spring的核心容器去管理
InstanceFactory instanceFactory = new InstanceFactory();
UserService userService1 = instanceFactory.getUserService();
//我们要创建的对象就在act核心容器中,使用spring的核心容器根据id获取对象
//已解耦
//UserService userService = (UserService) act.getBean("userService");
String name = userService1.getName();
System.out.println(name);
}
}
2.4 xml文件配置bean
通过bean标签配置对象 把对象交给Spring管理
2.4. 1.掌握的属性
id/name属性: 作为bean标签的唯一标识, 随便取, 不要重复就可以【一般使用接口/类的名字, 首字母小写】
class属性: 类的全限定名
scope属性: 配置bean的类型的
singleton 单例的【默认】, Spring把创建的对象存到Spring容器里面
prototype 多例的, 创建好之后, 不会存的Spring容器
request 把创建的对象存到request域
session 把创建的对象存到session域
2.4. 2.了解的属性
init-method属性: 初始化监听, 当被Spring创建的时候, 会调用这个方法
destroy-method属性: 销毁监听, 当被Spring从容器移除,Spring容器销毁, 会调用这个方法(不适合多例情况)
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--将要创建的类配置到配置文件当中-->
<!--方式一:构造函数方式
<bean id="userService" class="MyService"></bean>-->
<!--spring核心容器创建bean对象方式二
1。静态工厂创建对象,让spring核心容器管理静态工厂创建出来的对象
使用场景是:将工具类创建出来的对象交给spring的核心容器管理
id表示唯一标识
class表示静态工厂的类的权限定名
factory-method表示静态工厂中创建对象的那个方法
-->
<!--<bean id="userService" class="StaticFactory" factory-method="createUserService"></bean>-->
<!--实例工厂:让spring核心容器管理实例工厂和工厂创建出来的对象
1.使用bean标签,创建实例工厂对象并且交由spring核心容器管理(id是实例工厂的唯一标识)
2.调用实例工厂对象的方法,创建对象(id:创建对象的唯一标识
factory-bean标识:要调用哪个工厂对象的方法就填写哪个id
factory_method:表示调用工厂对象的哪个方法)
-->
<bean id="InstanceFactory" class="com.wlj.factory.InstanceFactory"></bean>
<bean id="userService" factory-bean="InstanceFactory" factory-method="getUserService"></bean>
</beans>