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.分离业务监控与业务处理.简单点 ...
随机推荐
- WiFi万能钥匙 for Macv1.1.0中文版
wifi万能钥匙 for Mac是一款运行在Mac平台上的免费WiFi热点软件,Mac分享无线流量.管理WiFi连接的必备神器.WiFi万能钥匙Mac版内置千万Wi-Fi热点数据,随时随地轻松接入无线 ...
- Docker构建FastDFS镜像
https://blog.csdn.net/qq_26440803/article/details/83066132 Dockerfile 所需依赖: fastdfs libfastcommon ...
- 梯度消失(vanishing gradient)和梯度爆炸(exploding gradient)
转自https://blog.csdn.net/guoyunfei20/article/details/78283043 神经网络中梯度不稳定的根本原因:在于前层上的梯度的计算来自于后层上梯度的乘积( ...
- jenkins 构建完毕后接着构建另外一个构建的方法
- linux中开启snmp协议
1.安装软件#yum -y install net-snmp 2.修改配置文件#vim /etc/snmp/snmpd.conf确保snmpd.conf文件中包含以下绿色内容:com2sec notC ...
- web安全类
web安全类主要分为两个部分:CSRF和XSS 一.CSRF 基本概念:CSRF,通常称为跨站请求伪造,英文名Cross-site request forgery 缩写为CSRF; 怎么防御 1.To ...
- okhttp 解析respone:
android,retrofit,okhttp,日志拦截器,使用拦截器Interceptor统一打印请求与响应的json: https://blog.csdn.net/qq_37043246/arti ...
- idea基本使用1
首先推荐两个快捷键 alt+Ent 相当于eclipse中的crtl+1 alt+ins :能创建包,类等,还能生成getter,setter,和构造函数 首先创建一个w ...
- java+Selenium+TestNg搭建自动化测试架构(3)实现POM(page+Object+modal)
1.Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例 ...
- vue2.0插件--loading
loading效果很常见,常见到我们任何一个项目中,都可以见到他的身影.今天就以loading作为切入口,唠叨一下vuejs的插件的写法. 看vuejs官方文档关于插件的说明,关于使用插件和写插件,V ...