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 ...
随机推荐
- 【CodeForces - 870C】
题意: 计算一个整数最多可以拆分为多少个合数(要求拆分的全是合数).例如:12的拆分法案是12=4+4+4. 合数是指除了1之外的非素数(正整数). 思路: 偶数的话用4.6就可以满足,奇数的话减去一 ...
- SQL SERVER 正则替换
use pubdbgo IF OBJECT_ID(N'dbo.RegexReplace') IS NOT NULL DROP FUNCTION dbo.RegexReplace GO --开始创建正则 ...
- ide 下spingboot 实现热部署
需要从maven中下载devtools插件pom.xml:step1:修改pom.xml<dependencies><dependency><groupId>org ...
- vue.js 源代码学习笔记 ----- 工具方法 debug
import config from '../config' import { noop } from 'shared/util' let warn = noop let tip = noop let ...
- 转-redux-saga
React+Redux Cycle(来源:https://www.youtube.com/watch?v=1QI-UE3-0PU) 让我惊讶的是,redux-saga 的作者竟然是一名金融出身的在 ...
- [置顶]
flume高并发优化——(14)解决空行停止收集数据问题,及offsets变小问题
日志平台运行一段时间,发现日志有部分丢失,通过检查日志,发现有两个问题导致数据丢失,一个是遇到空行后,日志停止收集,还有就是kafka监控offsets时变小,通过分析代码,找到如下方法: 空行问 ...
- ibatis 参数类型为map,map里面有list
<select id="getChannelLayerList" parameterClass="java.util.HashMap" re ...
- BZOJ4152 AMPPZ2014 The Captain 【最短路】【贪心】*
BZOJ4152 AMPPZ2014 The Captain Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点 ...
- flask第十八篇——模板【2】
请关注公众号:自动化测试实战 上一节我们介绍了模板的基本使用方法,现在我们想一个问题,如果把index.html放到template文件夹下面的文件夹该怎么办呢?其实很容易,当文件夹结构如下图所示时: ...
- [UOJ310][UNR #2]黎明前的巧克力
uoj description 给你\(n\)个数,求从中选出两个交集为空的非空集合异或和相等的方案数模\(998244353\). sol 其实也就是选出一个集合满足异或和为\(0\),然后把它分成 ...