Spring 学习之AOP
1. 走进面前切面编程
编程范式;
面向过程编程,c语言;
面向对象编程;c++,java,c#;
函数式编程;
事件驱动编程;
面向切面编程;
AOP是一种编程范式,不是编程语言;解决特定问题,不能解决所有问题;OOP的补充,不是竞争‘
AOP的初衷:解决代码重复性问题,解决关注点分离;
水平分离;展示层》服务层》持久层;
垂直分离:功能划分 订单库存等;
切面分离:分离功能性需求与非功能性需求;
使用AOP的好处:
集中管理;方便添加删除;增强代码的可读性与可维护性;
AOP的应用场景:
权限控制,缓存控制,事务控制,审计日志,性能监控;分布式追踪;异常处理等;;
支持AOP的编程语言:java,.net,c/c++,ruby python php;
案例:
1.产品管理的服务;
2.产品添加删除的操作只能管理员才能进行;
3.普通实现VSAOP实现;
spring boot 实现;
maven pom 引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
加入product类:
package com.example.aoptest.domain; public class Product {
private Long id;
private String name; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
service层代码:
package com.example.aoptest.service; import com.example.aoptest.domain.Product;
import org.springframework.stereotype.Service; @Service
public class ProductService {
public void insert(Product product){
System.out.println("insert product");
}
public void delete(Long id){
System.out.println("delete product");
}
}
测试类
package com.example.aoptest.domain; //模拟用户切换
public class CurrentUserHolder {
private static final ThreadLocal<String> holder = new ThreadLocal<>();
public static String get(){return holder.get() == null?"unknown":holder.get();}
public static void set(String user){holder.set(user);}
}
Service判断
package com.example.aoptest.service; import com.example.aoptest.domain.CurrentUserHolder;
import org.springframework.stereotype.Component;
@Component
public class AuthService {
public void checkAccess(){
String user = CurrentUserHolder.get();
if(!"admin".equals(user)){
throw new RuntimeException("operation not allow");
}
}
}
普通传统的校验权限的方式:
进入测试:
执行验证通过;
总结:
传统硬编码的方式的缺点呢:逻辑复杂度较高;
使用AOP
package com.example.aoptest.security; import com.example.aoptest.service.AuthService;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Aspect
@Component //给spring托管
public class SecurityAspect {
@Autowired
AuthService authService;
//切面,以下表达式有很多种,这里我们用注解的方式
//拦截标注有AdminOnly注解,进行操作;
@Pointcut("@annotation(AdminOnly)")
public void adminOnly(){ } //执行之前插入一段代码。
@Before("adminOnly()")
public void check(){
authService.checkAccess();
}
}
package com.example.aoptest.security; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) //只标注在方法级别
public @interface AdminOnly {
}
修改ProductService
//authService.checkAccess();
test测试 正常情况下失败的;因为没有捕获异常
给ProductService加上注解
package com.example.aoptest.service; import com.example.aoptest.domain.Product;
import com.example.aoptest.security.AdminOnly;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service
public class ProductService {
@Autowired
AuthService authService;
@AdminOnly
public void insert(Product product){
//传统的方式校验
//authService.checkAccess();
System.out.println("insert product");
}
@AdminOnly
public void delete(Long id){
//authService.checkAccess();
System.out.println("delete product");
}
}
执行测试类,正常通过的。
对比以上两种方式,aop侵入性这种方式更少;
为啥要引入aop的编程范式?
aop的好处及适用场景分别是什么?
aop的两大核心是什么?
Spring 学习之AOP的更多相关文章
- Spring学习之AOP的实现方式
Spring学习之AOP的三种实现方式 一.介绍AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能 ...
- Spring学习之AOP总结帖
AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组 ...
- spring学习(二) ———— AOP之AspectJ框架的使用
前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...
- Spring学习之AOP
Spring-AOP(Aspect-orented programming) 在业务流程中插入与业务无关的逻辑,这样的逻辑称为Cross-cutting concerns,将Crossing-cutt ...
- Spring学习之Aop的各种增强方法
AspectJ允许使用注解用于定义切面.切入点和增强处理,而Spring框架则可以识别并根据这些注解来生成AOP代理.Spring只是使用了和AspectJ 5一样的注解,但并没有使用AspectJ的 ...
- Spring学习之Aop的基本概念
转自:http://my.oschina.net/itblog/blog/209067 AOP的基本概念 AOP从运行的角度考虑程序的流程,提取业务处理过程的切面.AOP面向的是程序运行中的各个步骤, ...
- Spring学习之AOP与事务
一.概述 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续, ...
- spring学习笔记-AOP
1.aop:aspect oriented programming 面向切面编程 2.aop在spring中的作用: 提供声明式服务(声明式事务) 允许用户实现自定义切面 3.aop:在不改变原有 ...
- Spring 学习二-----AOP的原理与简单实践
一.Spring AOP的原理 AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程.何为切面,就比如说我们系统中的权限管理,日志,事务等我们都可以将其看 ...
随机推荐
- Excel 设置标题栏
1. 选中列表标题行, 可以设置字体居中显示,并放大字体以表示这是标题栏. 2. 选中列表第一数据行,即列表标题行下一行,选择View > Freeze Panes.
- poj-1239(递推关系)好难
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...
- 线上服务内存OOM问题定位[转自58沈剑]
相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的原因: 本身资源不够 申请的太多 资源耗尽 58到家架构部,运维部,58速运技术部联合进行了一次线上服务内存OOM问 ...
- 有向图与无向图的合并操作区别D(递归与并查集)
有向图的合并,典型问题:通知小弟(信息只能单向传播)https://www.nowcoder.com/acm/contest/76/E 无向图的合并,典型问题:修道路问题 由于无向图只要二者有联系即可 ...
- IP相关的方法
1.验证是否为IP地址 def isIP(ip, with_netmask=True): """ 判断IP的格式是否正确 :param ip: IP字符串 :param ...
- Git Authoritative Guide 学习
一.git命令1.git add -u : 将工作区中所有改动的文件添加到暂存区(修改.删除),但是不提交未被git跟踪的文件 -i : 可以进入交互界面选择性提交 -A : 相对于-u,它还提交新建 ...
- day37 mysql数据库学习
3.什么是数据库 用来存储数据的仓库 数据是以文件的形式保存 海峰补充内容 ↓ 4 数据库服务器.数据管理系统.数据库.表与记录的关系(重点理解!!!) 记录:1 刘海龙 324245234 2 ...
- 八、面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)
面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...
- Apache Derby数据库 安装、知识点
Apache Derby数据库 安装: 下载路径:http://archive.apache.org/dist/db/derby/ 出处:http://www.yiibai.com/hive/hive ...
- mySQL 教程 第5章 插入 更新与删除数据
使用SQL Manager管理工具连接到schoolDB.由于三张表都设置了主键,因此,以下练习中插入的记录,主键不能重. 插入数据 1. 练习:为表的所有字段插入数据 为表中所有字段插入数据,可以不 ...