定义

什么叫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切面编程实践【原创】的更多相关文章

  1. Method Swizzling和AOP(面向切面编程)实践

    Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...

  2. spring切面编程AOP 范例一

    参照网上的spring AOP编程实例进行配置,但是碰到了几个坑.这篇文章重点讲解一下我踩过的两个坑: 1.使用@Service自动装配的时候,基础扫描包配置要正确: 2.xml中切面配置中的exec ...

  3. Spring切面编程步骤

    什么是面向切面编程 面向对象的编程主要注重核心业务,而面向切面编程主要关注一些不是核心的业务,但又是必须的辅助功能,比如一个完整的系统中,记录平时系统运行时抛出的异常,需要我们去记录,以便我们对系统尽 ...

  4. spring aop使用,spring aop注解,Spring切面编程

    ================================ ©Copyright 蕃薯耀 2020-01-21 https://www.cnblogs.com/fanshuyao/ 一.第一步, ...

  5. spring切面编程

    xml配置实现 先写三个类 public String amethod(String s) {  System.out.println("This is AAAAAAAAAAAAAAAA&q ...

  6. Spring切面编程AOP

  7. Spring切面编程Aspect之@Before和@Around用法

    查看dao层使用的sql import java.util.Arrays; import org.apache.commons.lang.ArrayUtils; import org.aspectj. ...

  8. spring aop 切面编程中获取具体方法的方法

    spring 切面编程中获取具体方法的方法 工作中,使用环绕通知,用来捕获异常,然后通过获取方法的返回值,返回不同的数据给到调用方. 由于方法的返回值不同,我们处理异常时,也需要返回不同的格式. 这时 ...

  9. spring框架应用系列三:切面编程(带参数)

    本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7786715.html 解决问题 1.分离业务监控与业务处理.简单点 ...

随机推荐

  1. Nginx failing to load CSS and JS files (MIME type error)

    Nginx failing to load CSS and JS files (MIME type error) Nginx加载静态文件失败的解决方法(MIME type错误) 上线新的页面,需要在n ...

  2. devC++代码格式化对齐的快捷键

    devC++代码格式化对齐的快捷键是ctrl + shift + a ctrl + 左右键可以使光标移动一个单词的距离 shirt + 左右键可以选中光标左右的一个字符

  3. select大表报错

    MySQL查询大表报错 MySQL执行select操作时候,如果执行查询的表的数据量比较大,就会报错error code 2013.或者报错已杀死,并直接退出MySQL客户端.如下所示: mysql& ...

  4. Python中的@符号

    1.基本含义 @符号用做函数的修饰符,可以在模块或者类的定义层内对函数进行修饰,出现在函数定义的前一行,不允许和函数定义在同一行. 一个修饰符就是一个函数,它将被修饰的函数作为参数,并返回修饰后的同名 ...

  5. SqlServer高版本数据备份还原到低版本(转)

    原文地址:https://www.jb51.net/article/96454.htm 想要将Sqlserver2014高版本备份的数据还原到低版本SqlServer2008R2上去,但是这在SqlS ...

  6. elasticSearch 2.3 delete-by-query plugin

    The delete-by-query plugin adds support for deleteing all of the documents which match the specified ...

  7. 使用 JavaScript 拦截和跟踪浏览器中的 HTTP 请求

    HTTP 请求的拦截技术可以广泛地应用在反向代理.拦截 Ajax 通信.网页的在线翻译.网站改版重构等方面.而拦截根据位置可以分为服务器端和客户端两大类,客户端拦截借助 JavaScript 脚本技术 ...

  8. 二、初步认识springBoot的pom.xml

    1.  大体结构 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www. ...

  9. sas 9.4 sid 64bit 到期时间210804 带有EM

    PROC SETINIT RELEASE='9.4';SITEINFO NAME='NATIONAL PINGTUNG UNI OF SCIENCE&TECH'SITE=12001462 OS ...

  10. oracle导出表的建表语句拼接SQL

    前段时间有个需求需要导出数据库的500张表结构,使用PLSQLDEV工具也可以导出建表语句,但是需要手动一个表一个表选,非常费劲.就写了个拼接sql. select 'select dbms_meta ...