前言
什么是Spring boot, 为什么Spring boot在java领域这么流行
一说到这个问题, 那肯定要先从Spring讲起, 毕竟Spring boot实际上可以看做是Spring的扩展版, 在我的理解里, 用java的方式讲解Spring和Spring boot的话就是继承和被继承的关系
那么说到Spring, Spring的几个核心概念: 轻量级, AOP, IOC, DI又是不可忽视的, 本章就从Spring的几个核心概念为大家揭开Springboot的神秘面纱
Spring的核心概念
IOC(控制反转)
定义: IOC是一种设计思想, 被称为控制反转, 在Java开发中, 就是将原本手动创建对象的权利交由Spring框架进行管理
控制反转实际上就是当你想要创建对象的时候不自己去创建, 而是向Spring IOC容器发起请求, 告诉他我要创建哪个哪个对象了, 然后Spring IOC容器就会返回一个对象实例给你, 这就是IOC控制反转, 将创建对象的权利交由Spring IOC容器管理
优点:
- 可以极大地简化应用的开发, 降低藕合
- 对象由Spring IOC容器进行管理, 我们只需要配置好配置文件或注解就可以, 不用去关注对象的创建过程
- 资源易管理
DI(依赖注入)
定义: 依赖注入是IOC控制反转的具体实现, 是实现用于解决依赖性设计模式
因为对象资源的获取全部要依赖于Spring IOC容器, 组件之间的依赖关系由容器在应用系统运行期来决定, 在需要的时候由Spring IOC容器动态地往组件中注入需要的实例对象,就叫依赖注入
AOP(面向切面)
定义: 面向切面编程, AOP是OOP(面向对象编程)的一种延续
AOP主要解决:
- 在不改变原有业务逻辑的情况下, 增强横切逻辑代码
- 根本上解耦合
- 避免和企鹅逻辑代码重复
常见应用范围:
- 处理日志
- 安全管理
- 事务管理
AOP的通知(advice):
- 前置通知(Before): 在方法被调用之前执行
- 后置通知(After): 目标方法完成之后调用通知
- 返回通知(After-returning): 在目标方法完成之后调出通知, 不管成功还是失败
- 异常通知(After-throwing): 在目标方法抛出异常之后通知
- 环绕通知(Around): 通知环绕在方法前后, 自定义通知执行在方法前后的内容
和aop相似的拦截器, 过滤器, 三者的区别
过滤器, 拦截器拦截的是URL, AOP拦截的是类的元数据(包, 类, 方法名, 参数等)
三者的功能类似, 但是各有各的优势, 过滤器 -- > 拦截器 --> aop 拦截规则越来越细致, 执行的顺序依次是 过滤器 --> 拦截器 --> aop
around的demo
package com.ningxuan.demo.conifg; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; import java.util.Arrays; /** * aop测试 */ @Aspect @Component public class AopConfig { /** * 环绕通知 * 在com.yl.spring.aop.ArithmeticCalculator接口的每一个方法执行前后都执行一段代码 * @param pjd 环绕通知必须有返回值, 返回值为目标方法的返回值 */ @Around("execution(public int com.ningxuan.demo.controller.TestController.*(..))") public Object roundTest(ProceedingJoinPoint pjd) { Object result = null; String methodName = pjd.getSignature().getName(); //执行目标方法 try { //前置通知 System.out.println("The method " + methodName + " begins with " + Arrays.asList(pjd.getArgs())); result = pjd.proceed(); //返回通知 System.out.println("The method " + methodName + " ends with " + Arrays.asList(pjd.getArgs())); } catch (Throwable e) { //异常通知 System.out.println("The method " + methodName + " occurs expection : " + e); throw new RuntimeException(e); } //后置通知 System.out.println("The method " + methodName + " ends"); return result; } } 复制代码
总结
- Spring通过IOC, AOP来简化java开发
- Spring的IOC降低了组件间的耦合性
- AOP天生适合做日志/事务等集中式处理, 提高了代码的复用性
- Spring的生态及其完整, 是国内名副其实的大哥大