1、Spring初识
1、Spring是一个轻量级Java开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的 JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。 Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。 Spring可以做很多事情,它为企业级开发提供给了丰富的功能,但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入(dependency injection,DI)和面向切面编程(aspect-oriented programming, AOP)。
2、核心内容
spring是一个轻量级的开源框架。
spring为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。spring是一个IOC和AOP的容器框架。
IOC:控制反转
AOP:面向切面编程
容器:包含并管理应用对象的生命周期
3、使用spring的优点
3.1、Spring通过DI、AOP和消除样板式代码来简化企业级Java开发
3.2、Spring框架之外还存在一个构建在核心框架之上的庞大生态圈,它 将Spring扩展到不同的领域,如Web服务、REST、移动开发以及NoSQL
3.3、低侵入式设计,代码的污染极低
3.4、独立于各种应用服务器,基于Spring框架的应用,可以真正实现 Write Once,Run Anywhere的承诺
3.5、Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦
3.6、Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行 集中式处理,从而提供了更好的复用
3.7、Spring的ORM和DAO提供了与第三方持久层框架的的良好整合, 并简化了底层的数据库访问
3.8、Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可 自由选用Spring框架的部分或全部
3.9、任何一个语言或者任何一个框架想要立于不败之地,那么很重要的 就是它的生态。
4、spring的模块划分图
Data Access/Integration:数据的获取/整合模块,包括了JDBC,ORM,OXM,JMS和事务模块
Web:提供面向web整合特性
5、IOC(Inversion of Control):控制反转
5.1、基本概念
IOC是一种设计思想,在Java开发中,将你设计好的对象交给容器控制,而不是显示地用代 码进行对象的创建。(创建对象交给spring来处理,不用 new Object()等等来操作了)
把创建和查找依赖对象的控制权交给 IoC 容器,由 IoC 容器进行注入、组合对象之间的关 系。这样对象与对象之间是松耦合、功能可复用(减少对象的创建和内存消耗),使得程序 的整个体系结构可维护性、灵活性、扩展性变高。 所谓IOC ,就简短一句话:对象由 spring来创建、管理,装配!
5.2、为什么使用IOC?
5.2.1 接口分离原则ISP(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来
5.2.2 依赖倒置原则DIP(the Dependency Inversion Principle DIP)
具体实现依赖抽象,下层依赖上层。 依赖倒置原则使鼠标、键盘和电脑成为独立的的互不相干的对象,当电脑(上 层)没有鼠标可以正常启动但是鼠标(下层)没有电脑则一无是处 ,控制权就被反转 了(IOC)。 所以鼠标需要依赖USB(DI)才能使用。
之前——正转: 主板焊接>鼠标 电脑没有鼠标则无法启动
现在——反转: 电脑<依赖鼠标 引入DI可以实现IOC
IOC是DIP的设计原理,DI是IOC的具体实现
5.3 如何使用 IOC?
5.3.1 导入jar包---配置xml
a、导入相关的jar包
b、配置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"> <bean id="user" class="com.zhl.entity.User"></bean> </beans>
c、编写测试类
public class IocTest { @Test public void test(){ ApplicationContext context = new ClassPathXmlApplicationContext("spring-ioc.xml"); User user = context.getBean(User.class); } }
5.3.2 maven+注解+xml
a、配置maven依赖
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.1</version> <scope>compile</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
b. pom.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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!--<bean id="user" class="com.zhl.entity.User"></bean>--> <context:component-scan base-package="com.zhl.entity"></context:component-scan> </beans>
c、Java类
@Controller public class User { private Integer id; private String username; private String realname; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getRealname() { return realname; } public void setRealname(String realname) { this.realname = realname; } public User() { System.out.println("创建了一个对象"); } }
d、测试类
@Test public void test(){ ApplicationContext context = new ClassPathXmlApplicationContext("spring-ioc.xml"); User user = context.getBean(User.class); }
5.3.3 最屌实现方式:springboot+javaconfig(整理了再完善)
5.4 IOC的优点
解耦
1. 集中管理
2. 功能可复用(减少对象的创建和内存消耗)
3. 使得程序的整个体系结构可维护性、灵活性、扩展性变高
4. 解耦
6、总结
DI与IOC 很多人把IOC和DI说成一个东西,笼统来说的话是没有问题的,但是本质上还是有所区别的,希望大家能够 严谨一点,IOC和DI是从不同的角度描述的同一件事,IOC是从容器的角度描述,而DI是从应用程序的角度 来描述,也可以这样说,IOC是依赖倒置原则的设计思想,而DI是具体的实现方式
在面向对象设计的软件系统中,底层的实现都是由N个对象组成的,所有的对象 通过彼此的合作,最终实现系统的业务逻辑。
有一个对象出了问题,就可能会影响到整个流程的正常运转。现在,伴随着工业级应用的规 模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关 系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过 高的系统,必然会出现牵一发而动全身的情形。
大家看到了吧,由于引进了中间位置的“第三方”,也就是IOC容器,对象和对 象之间没有了耦合关系, 它起到了一种类似“粘合剂”的作用,把系统中的所 有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此 失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。 通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变 为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。