Spring切面编程实践【原创】
定义
什么叫Spring面向切面编程(AOP),请自行百度,这边就不做详细介绍了。
场景
有两个对象,字典和工程信息Bean,每次新增或修改对象时,记录新增和修改的时间。
基类定义
package myTest.entity; import lombok.Data; import java.time.LocalTime; /**
* entity基类
*/
@Data
public class BaseEntity {
private Long id;
private LocalTime createTime;
private LocalTime updateTime;
}
子类定义
package myTest.entity; import lombok.Data; /**
* 字典信息
*/
@Data
public class DictEntity extends BaseEntity{
private String key;
private String value;
}
package myTest.entity; import lombok.Data; /**
* 项目信息
*/
@Data
public class ProjectEntity extends BaseEntity {
private String projectName;
}
注:这边使用了lombok,不熟悉的同学可以查看https://www.cnblogs.com/meituan/p/10510889.html
常规做法
service基类
package myTest.service;
public interface BaseService<T> {
void save(T entity);
void update(T entity);
}
字典Service实现
package myTest.service;
import myTest.entity.DictEntity;import org.springframework.beans.factory.annotation.Autowired;
import java.time.LocalTime;
public class DictService implements BaseService<DictEntity> {
@Autowired
private DictDao dao;
@Override
public void save(DictEntity entity){
entity.setCreateTime(LocalTime.now());
entity.setUpdateTime(LocalTime.now());
dao.save(entity);
}
@Override
public void update(DictEntity entity){
entity.setUpdateTime(LocalTime.now());
dao.update(entity);
}
}
工程Service实现
package myTest.service; import myTest.entity.ProjectEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.time.LocalTime; @Service
public class ProjectService implements BaseService<ProjectEntity> { @Autowired
private ProjectDao dao; @Override
public void save(ProjectEntity entity){
entity.setCreateTime(LocalTime.now());
entity.setUpdateTime(LocalTime.now());
dao.save(entity);
} @Override
public void update(ProjectEntity entity){
entity.setUpdateTime(LocalTime.now());
dao.update(entity);
} }
反思
常规做法做了重复劳动工作,如果entity子类更多的话,重复劳动会更多,而且很不容易维护,这时候就可以用到Spring的切面编程思想。
使用Spring AOP解决问题
大致思路可以这样,当Service执行save和update方法的时候,定义一个切点,在执行到这个切点的时候,统一加入更新时间和新增时间的控制,一处增加,多处使用,省时省力,而且便于维护。上代码!
- 首先,在pom文件中引入aspect依赖的jar包,如下
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
- 其次,定义切点和前置通知
package myTest; import myTest.entity.BaseEntity;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component; import java.time.LocalTime;
import java.util.Arrays;
import java.util.List; /**
* 定义切点和前置通知,统一修改新增时间和修改时间
*/
@Aspect
@Component
public class Asepect { @Pointcut("execution(* myTest.service.DictService.save*(..)) || execution(* myTest.service.DictService.update*(..)) || " +
"execution(* myTest.service.ProjectService.save*(..)) || execution(* myTest.service.ProjectService.update*(..))")
public void addAndUpdatePointCut(){} @Before("addAndUpdatePointCut()")
public void before(JoinPoint joinPoint) {
//获取方法名
String mathName = joinPoint.getSignature().getName();
//获取参数列表
List<Object> args = Arrays.asList(joinPoint.getArgs());
for (Object o :
args) {
if (o instanceof BaseEntity) {
((BaseEntity) o).setUpdateTime(LocalTime.now());
if (mathName.startsWith("save")) {
((BaseEntity) o).setCreateTime(LocalTime.now());
}
}
}
} }
就这样两个简单的步骤,就可以解决原始方法带来的重复工作和不易维护的问题,是不是很爽?
【纯手打,请多多支持,谢谢】
Spring切面编程实践【原创】的更多相关文章
- Method Swizzling和AOP(面向切面编程)实践
Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...
- spring切面编程AOP 范例一
参照网上的spring AOP编程实例进行配置,但是碰到了几个坑.这篇文章重点讲解一下我踩过的两个坑: 1.使用@Service自动装配的时候,基础扫描包配置要正确: 2.xml中切面配置中的exec ...
- Spring切面编程步骤
什么是面向切面编程 面向对象的编程主要注重核心业务,而面向切面编程主要关注一些不是核心的业务,但又是必须的辅助功能,比如一个完整的系统中,记录平时系统运行时抛出的异常,需要我们去记录,以便我们对系统尽 ...
- spring aop使用,spring aop注解,Spring切面编程
================================ ©Copyright 蕃薯耀 2020-01-21 https://www.cnblogs.com/fanshuyao/ 一.第一步, ...
- spring切面编程
xml配置实现 先写三个类 public String amethod(String s) { System.out.println("This is AAAAAAAAAAAAAAAA&q ...
- Spring切面编程AOP
- Spring切面编程Aspect之@Before和@Around用法
查看dao层使用的sql import java.util.Arrays; import org.apache.commons.lang.ArrayUtils; import org.aspectj. ...
- spring aop 切面编程中获取具体方法的方法
spring 切面编程中获取具体方法的方法 工作中,使用环绕通知,用来捕获异常,然后通过获取方法的返回值,返回不同的数据给到调用方. 由于方法的返回值不同,我们处理异常时,也需要返回不同的格式. 这时 ...
- spring框架应用系列三:切面编程(带参数)
本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7786715.html 解决问题 1.分离业务监控与业务处理.简单点 ...
随机推荐
- 深入理解CSS选择器优先级
题外话 今天把 <CSS REFACTORING>(中文名叫<CSS重构:样式表性能调优>)电子书粗略的浏览了一遍,这本书很薄,150页左右,首先是介绍了什么是重构并举了两个简 ...
- pascalcontext-fcn全卷积网络结构理解
一.说明 fcn的开源代码:https://github.com/shelhamer/fcn.berkeleyvision.org 论文地址:fully convolutional networks ...
- 使用LFSR搭建误差补偿系统
使用LFSR搭建误差补偿系统 首先弄明白什么是LFSR 线性反馈移位寄存器(LFSR)是内测试电路中最基本的标准模块结构,既用作伪随机测试码产生器,也作为压缩测试结果数据的特征分析器. 一个n阶的LF ...
- js 获取url中的参数 修改url 参数 移除url参数
js 获取url中的参数 修改url 参数 移除url参数 var jsUrlHelper = { getUrlParam : function(url, ref) { var str = " ...
- Xorboot-UEFI新手入门教程
Xorboot-UEFI新手入门教程 Xorboot-UEFI是一款UEFI下轻量级的图形化多系统引导程序,pauly于2014年国庆节期间发布了预览版.搜了下论坛,关于Xorboot- ...
- LAB1 partII
PartII 实现单词统计 实现 main/wc.go 两个函数 mapF() . reduceF() 单词是任意字母连续序列, 由unicode.IsLetter 决定字母 测试数据 pg-*. ...
- 设置 P2415Q & P2715Q 显示器使其支持 HDMI 2.0 启用 4k@60hz
简介:2016 年 2 月后购买的 Dell P2415Q 和 P2715Q 显示器,支持 HDMI 2.0,但是默认启用的是 HDMI 1.4. HDMI 2.0 默认没有启用 Dell P2415 ...
- 一个tomcat下部署不同端口多个应用
通过配置tmcat的server.xml来实现多端口多应用: <?xml version='1.0' encoding='utf-8'?> <Server port="80 ...
- Tomcat中acceptCount,maxConnections、maxThreads的含义及关系
个人对tomcat连接器3个属性maxConnections.maxThreads.acceptCount的理解: 先摘取官网对这3个属性的描述: acceptCount The maximum qu ...
- WRF安装过程
WRF安装过程 1. 在虚拟机VMware上安装Fedora 12 x64操作系统. 2. 安装PGI9.01 a) 电驴上可下载[[顶级编译器].PGI.Workstation.C ...