一、Spring概述:
Spring是一个开源框架,其存在的根本使命就是简化JAVA开发。为了降低JAVA开发的复杂性,Spring采取了以下四种关键策略:
- 基于POJO的最轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合;
- 基于切面和惯例进行声明式编程;
- 通过切面和模板减少样板式代码。
1.1 Spring有两个核心部分:IOC和AOP:
(1) IOC: 控制反转,把创建对象过程交给Spring进行管理;
(2) AOP: 面向切面,不修改源代码,进行功能增强。
1.2 Spring特点:
- 方便解耦,简化开发;(IOC)
- AOP编程支持;
- 方便程序测试;
- 方便和其他框架进行整合;
- 方便进行事务操作;
- 降低API开发难度。
二、IOC容器:
控制反转,就是将对象创建和对象之间的调用过程,交给Spring进行管理,使用IOC的目的就是降低耦合度。
2.1 spring示例:
创建一个普通类:
public class User {
public void add(){
System.out.println("add____");
}
}
创建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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置User对象 -->
<bean id="user" class="com.wyf.spring5.User"></bean>
</beans>
编写测试代码:
import com.wyf.spring5.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring5 {
@Test
public void testAdd(){
//1. 加载spring 配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
//2. 获取配置创建的对象
User user = context.getBean("user", User.class);
System.out.println(user);
user.add();
}
}
2.2 IOC底层原理:
IOC的底层主要用到了三个技术,分别是:
- XML解析
- 工程模式
- 反射
2.2.1 工程模式解耦
如下图,我们有两个类,分别为UserService类(包含方法execute)和UserDao(包含方法add),我们在UserService类中调用UserDao类的add方法,传统方法使用new的方式,在UserService类中创建UserDao对象,然后调用UserDao的add方法。这种方式虽然能够达到目的,但是UserService类和UserDao类的关联度太高了,也就是耦合度太高了。UserDao类的改变会导致UserService类也必须做出相应的变化。
针对传统模式存在的耦合度高的问题,我们可以采用工厂模式,一定程度上降低耦合,如下图所示。我们依然存在两个类,UserService类(包含方法execute)和UserDao(包含方法add),同样在UserService类中调用UserDao的add方法,采用传统方式,耦合度太高。我们可以创建一个工厂类UserFactory,该类中包含一个返回值为UserDao的静态方法,当UserService需要UserDao时,可以通过调用工厂类UserFactory中的方法获得,这样,我们就降低了UserService类和UserDao类之间的耦合度。这种方式虽然将UserService和UserDao进行了解耦,但是,也存在新的问题,就是将UserService和UserFactory进行了耦合,实际中不可能消除耦合,我们最终的目的是将耦合度降到最低。该例还可以继续降低耦合,就是IOC控制反转。
2.2.2 IOC解耦
IOC的解耦过程如下所示:
IOC进行解耦时,第一步我们需要在xml配置文件中配置创建的对象(如上例中所示的配置文件),第二步,当我们需要某个配置文件中的类时,我们可以创建一个工厂类,在工厂类中我们首先通过解析XML文件,获取类的配置信息,然后通过反射创建并获取到这个类。
2.3 IOC接口:
IOC思想基于IOC容器完成,IOC容器底层(本质上)就是对象工厂。spring提供了两种方式IOC容器的实现(两个接口):
- BeanFactory接口:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用 。 * 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
- ApplicationContext接口:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用。* 加载配置文件时候就会把在配置文件对象进行创建
ApplicationContext接口的实现类:
三、结束
本文简单介绍了spring框架,并简单介绍了IOC控制反转的底层原理,其主要基于XML解析、工厂模式以及反射实现。