Spring各模块介绍与Spring要点引入(IOC控制反转,AOP面向切面编程的引入)

Spring 是分层的 Java SE/EE 一站式轻量级开源框架,
以 IoC(Inverse of Control,控制反转)和 AOP(Aspect Oriented Programming,面向切面编程)为内核。

我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。

就是说我们平时说的使用Spring,指的是使用Spring Framework中的某些模块来完成自己的需求

Spring的特点

特性:

  1. 非入侵式 : 基于Spring开发的应用程序可以不用依赖spring的API
  2. 控制反转IOC :将创建对象的权限交给spring。
  3. 依赖注入DI :类中的依赖对象不需要手动set,而是通过配置赋值
  4. 面向切面AOP : 在不修改源代码的情况下给程序动态统一添加某种特定功能
  5. 容器化:Spring 是一个容器,因为它包含并且管理应用对象的生命周期
  6. 组件化:Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象。
  7. 一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库

列举一些spring重要的模块spring-framework-introduce-8.png

上图中包含了 Spring 框架的所有模块,这些模块可以满足一切企业级应用开发的需求,在开发过程中可以根据需求有选择性地使用所需要的模块。

Core Container(Spring的核心容器)

image.png
核心容器是建立其他模块的基础,没有这些模块,就不会有AOP,Web等的上层模块的功能

Beans模块:
提供了框架的基础部分,包括控制反转和依赖注入

Core模块:
封装了Spring的底层部分,包括资源访问,类型转化和一些工具类

Context模块:
此模块是建立在Beans模块和Core模块基础之上的,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点。

SpEL 模块:
提供了强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean,它也支持列表投影、选择和一般的列表聚合等。spring-framework-introduce-9.png

Data Access/Integration(数据访问/集成)

image.png
JDBC 模块
提供了一个 JBDC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,而且能享受到 Spring 管理事务的好处。

ORM 模块
提供与流行的“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且还可以使用 Spring 事务管理,无需额外控制事务。

OXM 模块
提供了一个支持 Object /XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据,或者将XML 数据映射成 Java 对象。

JMS 模块
指 Java 消息服务,提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

Transactions 事务模块
支持编程和声明式事务管理。

spring-framework-introduce-10.png

Web模块

image.png
[

](https://www.pdai.tech/md/spring/spring-x-framework-introduce.html)
Web 模块
提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IOC 容器初始化以及 Web 应用上下文。

Servlet 模块
提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作。

WebSocket 模块
提供了简单的接口,用户只要实现响应的接口就可以快速的搭建 WebSocket Server,从而实现双向通讯。

Webflux 模块
Spring WebFlux 是 Spring Framework 5.x中引入的新的响应式web框架。与Spring MVC不同,它不需要Servlet API,是完全异步且非阻塞的,并且通过Reactor项目实现了Reactive Streams规范。Spring WebFlux 用于创建基于事件循环执行模型的完全异步且非阻塞的应用程序。

spring-framework-introduce-11.png

AOP、Aspects、Instrumentation和Messaging
image.png
[

](https://www.pdai.tech/md/spring/spring-x-framework-introduce.html)
AOP 模块
提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。

Aspects 模块
提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。

Instrumentation 模块
提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。

messaging 模块
Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。

jcl 模块
Spring 5.x中新增了日志框架集成的模块。

spring-framework-introduce-12.png

Test模块

image.png

Test 模块:

Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能。
包含Mock Objects, TestContext Framework, Spring MVC Test, WebTestClient。

spring-framework-introduce-13.png

Spring要点引入

设计一个场景

  1. 查询用户数据 - 来看DAO+POJO-> Service 的初始化和装载。
  2. 给所有Service的查询方法记录日志

image.png

体现了那些要点

控制反转 IOC

第一个需求,查询用户,本质上就是service 通过调用dao查询pojo,如何创建User、dao、service等

如果没有spring,我们需要手动new

UserDaoImpl userDao = new UserDaoImpl();
UserSericeImpl userService = new UserServiceImpl();
userService.setUserDao(userDao);
List<User> userList = userService.findUserList();

有了Spring框架,可以将原有的Bean的创建工作转移给框架,需要时从容器中获取即可,简化了开发工作

// create and configure beans
ApplicationContext context =
        new ClassPathXmlApplicationContext("aspects.xml", "daos.xml", "services.xml");

// retrieve configured instance
UserServiceImpl service = context.getBean("userService", UserServiceImpl.class);

// use configured instance
List<User> userList = service.findUserList();
要点
  • Spring框架管理这些Bean的创建工作,即由用户管理Bean转变为框架管理Bean,这个就叫控制反转 - Inversion of Control (IoC)
  • Spring 框架托管创建的Bean放在哪里呢? 这便是IoC Container;
  • Spring 框架为了更好让用户配置Bean,必然会引入不同方式来配置Bean? 这便是xml配置,Java配置,注解配置等支持
  • Spring 框架既然接管了Bean的生成,必然需要管理整个Bean的生命周期等;
  • 应用程序代码从Ioc Container中获取依赖的Bean,注入到应用程序中,这个过程叫 依赖注入(Dependency Injection,DI) ; 所以说控制反转是通过依赖注入实现的,其实它们是同一个概念的不同角度描述。通俗来说就是IoC是设计思想,DI是实现方式

面向切面 AOP

第二个需求 给Service所有方法调用添加日志(调用方法时),本质上是解耦问题;

如果没有Spring框架,我们就需要对每一个service中的方法加上日志功能

/**
* find user list.
*
* @return user list
*/
public List<User> findUserList() {
    System.out.println("execute method findUserList");
    return this.userDao.findUserList();
}
  • 有了Spring框架,通过@Aspect注解 定义了切面,这个切面中定义了拦截所有service中的方法,并记录日志; 可以明显看到,框架将日志记录和业务需求的代码解耦了,不再是侵入式的了
/**
* aspect for every methods under service package.
*/
@Around("execution(* tech.pdai.springframework.service.*.*(..))")
public Object businessService(ProceedingJoinPoint pjp) throws Throwable {
    // get attribute through annotation
    Method method = ((MethodSignature) pjp.getSignature()).getMethod();
    System.out.println("execute method: " + method.getName());

    // continue to process
    return pjp.proceed();
}

要点
  • Spring 框架通过定义切面, 通过拦截切点实现了不同业务模块的解耦,这个就叫面向切面编程 - Aspect Oriented Programming (AOP)
  • 为什么@Aspect注解使用的是aspectj的jar包呢?这就引出了Aspect4J和Spring AOP的历史渊源,只有理解了Aspect4J和Spring的渊源才能理解有些注解上的兼容设计
  • 如何支持更多拦截方式来实现解耦, 以满足更多场景需求呢? 这就是@Around, @Pointcut… 等的设计
  • 那么Spring框架又是如何实现AOP的呢? 这就引入代理技术,分静态代理和动态代理,动态代理又包含JDK代理和CGLIB代理等

SpringBoot托管配置

由于spring 的bean配置机制,每一个第三方的bean都需要手动配置bean注入到容器中,这会导致当系统变大,所需要的配置就越来越多,最终成为配置地狱。

springboot 就通过约定大于配置的原则,使用 xx-starter 统一的对beng进行默认初始化,用户只需要很少的配置就可以进行开发了。

正是由于springboot的出现,大大增加了spring家族的影响力,由于xx-starter的原因,很多其他的第三方厂家可以开发出自己的starter启动器去很方便的接入springboot,以达到只需要引入第三方的starter,就可以直接在springboot中使用这个插件,大大的简化了开发。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值