Spring AOP两种实现方式
一. AOP 概念:
Spring AOP 即Aspect Oriented Programming(面向切面编程), 实现方式分为两种:
1. 注解(Annotation)
2. 配置(Configure)
二. 应用场景:
1. 权限管理;
2. 表单验证;
3. 事务管理;
4. 信息过滤;
5. 拦截器;
6. 过滤器;
7. 日志等等; 三. AOP实现:
1. 基于Annotation的实现
package com.myframework.xj.security.service; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import com.myframework.xj.credit.CreditException;import com.myframework.xj.security.entity.CheckDetails;
import com.myframework.xj.security.entity.User; /**
* 基于注解的AOP实现核查扣款功能
* @author lvm
*
*/
@Component
@Aspect
public class CheckServiceAspect { private static final Logger logger = LoggerFactory.getLogger(CheckServiceAspect.class); @Autowired
private CheckDetailsService checkDetailsService;//配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
@Pointcut("execution(* com.myframework.xj.security.service.*..(..))")
public void aspect(){} /**
* 实现代码
* @param call
* @return
* @throws Throwable
*/
@Around("aspect()")
public Object aroundCheck(ProceedingJoinPoint call) throws Throwable {
logger.info("CheckServiceAspect aroundCheck begin..."); Object[] args = call.getArgs();
//1.当前登录人
if(args[0] == null || !(args[0] instanceof User))
throw new CreditException("当前登录人不能为空");
User user = (User)(args[0]); //2.查询金额
CheckDetails details = new CheckDetails();
if(user.getFund() == null || user.getFund().compareTo(details.getPayment()) <0)
throw new CreditException("当前登录人账户余额不够");
try {
return call.proceed();
} finally {
details.setCreatedBy(user);
checkDetailsService.save(details);
logger.info("CheckServiceAspect aroundCheck end...");
}
} }
基于Annotationd的实现需要保证可以被配置文件扫描到
<!-- 激活组件扫描功能,在包com.myframework.xj.security.service及其子包下面自动扫描通过注解配置的组件 -->
<context:component-scan base-package="com.myframework.xj.security.service"/>
<!-- 激活自动代理功能 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
2. 基于Configure的实现
Java实现代码如下:
package com.myframework.xj.security.service; import org.aspectj.lang.ProceedingJoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.myframework.xj.credit.CreditException;
import com.myframework.xj.security.entity.CheckDetails;
import com.myframework.xj.security.entity.User; /**
* 根据配置文件实现AOP实现扣款功能
* @author lvm
*
*/
public class Aspect { private static final Logger logger = LoggerFactory.getLogger(CheckAspect.class); private CheckDetailsService checkDetailsService; public void setCheckDetailsService(CheckDetailsService checkDetailsService) {
this.checkDetailsService = checkDetailsService;
} /**
* 实现代码
* @param call
* @return
* @throws Throwable
*/
public Object aroundCheck(ProceedingJoinPoint call) throws Throwable { logger.info("Aspect aroundCheck begin..."); Object[] args = call.getArgs();
//1.当前登录人
if(args[0] == null || !(args[0] instanceof User))
throw new CreditException("当前登录人不能为空");
User user = (User)(args[0]); //2.查询金额
CheckDetails details = new CheckDetails();
if(user.getFund() == null || user.getFund().compareTo(details.getPayment()) <0)
throw new CreditException("当前登录人账户余额不够");
try {
return call.proceed();
} finally {
details.setCreatedBy(user);
checkDetailsService.save(details);
logger.info("Aspect aroundCheck end...");
}
}
}
配置文件如下:
<bean id="checkDetailsServiceImpl" class="com.myframework.xj.security.service.CheckDetailsServiceImpl"/>
<bean id="reportServiceImpl" class="com.myframework.xj.credit.service.ReportServiceImpl"/>
<bean id="checkAspectExecutor" class="com.myframework.xj.security.service.CheckAspect">
<property name="checkDetailsService" ref="checkDetailsServiceImpl"/>
<property name="reportService" ref="reportServiceImpl"/>
</bean>
<aop:config>
<aop:aspect id="checkAspect" ref="checkAspectExecutor">
<aop:pointcut id="checkPointcut" expression="execution(* com.myframework.xj.security.service.CheckDetailsServiceImpl.check*(..))"/>
<aop:around pointcut-ref="checkPointcut" method="aroundCheck" />
</aop:aspect>
</aop:config>
四. Annotation和Configure实现比较
配置麻烦点 但是可读性好点
注解方便
Spring AOP两种实现方式的更多相关文章
- spring aop两种配置方式
基于注解的Spring AOP开发 简单案例快速入门 定义目标类接口和实现类 /** * Created by zejian on 2017/2/19.*/ //接口类 public interfac ...
- spring aop两种配置方式(1)
第一种:注解配置AOP注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before ...
- java框架篇---spring aop两种配置方式
第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Befor ...
- struts2和spring的两种整合方式
首先,来看看如何让Spring 来管理Action. 在struts.xml中加入 <constant name="struts.objectFactory" value=& ...
- struts2+spring的两种整合方式
也许有些人会因为学习了struts1,会以为struts2.struts1与spring的整合也是一样的,其实这两者相差甚远.下面就来讲解一下struts2与spring的整合两种方案.(部分转载,里 ...
- Spring的两种代理方式:JDK动态代理和CGLIB动态代理
代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对 ...
- Spring AOP四种实现方式Demo详解与相关知识探究
一.前言 在网络上看到一篇博客Spring实现AOP的4种方式,博主写的很通俗易懂,但排版实在抓狂,对于我这么一个对排版.代码格式有强迫症的人来说,实在是不能忍受~~~~(>_<)~~~~ ...
- 学习JavaWeb aop两种配置方式
aop aop:面向切面编程,它可以解决重复代码. aop有两种方式: 一..xml方式 1.在springmvc-servlet.xml中配置aop,应用bean文件: <!--aop配置-- ...
- 死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
随机推荐
- Mysql 表锁定的问题
下面的几个语句查询到,但如何定位到对应的进程,还需要学习这些表的结构. select * from information_schema.innodb_trx ## 当前运行的所有事务select * ...
- matlab eye 函数
eye(n,n) 产生一个n*n的单位矩阵 eye(n,m) 产生一个n*m的单位矩阵 eye(3,3) ans = 1 0 0 0 1 0 0 0 1 eye(3,4) ans = 1 0 0 0 ...
- vue 自定义拖拽指令
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- RabbitMQ(3) Java客户端使用
RabbitMQ针对不同的开发语言(java,python,c/++,Go等等),提供了丰富对客户端,方便使用.就Java而言,可供使用的客户端有RabbitMQ Java client. Rabbi ...
- 转:SQL Server服务器名称与默认实例名不一致的修复方法
--原因分析: --SERVERPROPERTY 函数的 ServerName 属性与@@SERVERNAME 返回相似的信息. --ServerName 属性提供Windows 服务器和实例名称,两 ...
- 转:android Support 兼容包详解
本文转自stormzhang的ANDROID SUPPORT兼容包详解 背景 来自于知乎上邀请回答的一个问题Android中AppCompat和Holo的一个问题?, 看来很多人还是对这些兼容包搞不清 ...
- d3.js(v5.7)的比例尺以及坐标轴
直接上代码了,这里的一些函数用的是之前我自己封装的函数(包括attr的obj支持和节点数量和数据数量的自动匹配),若有不明白的,可以查看之前的博客: 页面的效果如下: 接下来继续添加坐标轴: 最终:
- redis事务浅析
事务可以简单理解为:把多件事当做一件事情处理,要么一起成功,要么一起失败.在Spring中可以配置一个事务管理器,然后在要进行事务处理的方法上添加@Transactional注解就可以了. 对于red ...
- vue中axios的深入使用
如上所示一条简单的请求数据,用到了vue中axios,promise,qs等等 这里我将vue中用到的axios进行了封装方便日后使用 先对工具类进行封装utils/axios.js: // 引入模 ...
- Linux服务器运行环境搭建(二)——Redis数据库安装
官网地址:http://redis.io/ 官网下载地址:http://redis.io/download 1. 下载Redis源码(tar.gz),并上传到Linux 2. 解压缩包:tar zxv ...