一. 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两种实现方式的更多相关文章

  1. spring aop两种配置方式

    基于注解的Spring AOP开发 简单案例快速入门 定义目标类接口和实现类 /** * Created by zejian on 2017/2/19.*/ //接口类 public interfac ...

  2. spring aop两种配置方式(1)

    第一种:注解配置AOP注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before ...

  3. java框架篇---spring aop两种配置方式

    第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Befor ...

  4. struts2和spring的两种整合方式

    首先,来看看如何让Spring 来管理Action. 在struts.xml中加入 <constant name="struts.objectFactory" value=& ...

  5. struts2+spring的两种整合方式

    也许有些人会因为学习了struts1,会以为struts2.struts1与spring的整合也是一样的,其实这两者相差甚远.下面就来讲解一下struts2与spring的整合两种方案.(部分转载,里 ...

  6. Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对 ...

  7. Spring AOP四种实现方式Demo详解与相关知识探究

    一.前言 在网络上看到一篇博客Spring实现AOP的4种方式,博主写的很通俗易懂,但排版实在抓狂,对于我这么一个对排版.代码格式有强迫症的人来说,实在是不能忍受~~~~(>_<)~~~~ ...

  8. 学习JavaWeb aop两种配置方式

    aop aop:面向切面编程,它可以解决重复代码. aop有两种方式: 一..xml方式 1.在springmvc-servlet.xml中配置aop,应用bean文件: <!--aop配置-- ...

  9. 死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

随机推荐

  1. 【CodeForces - 870C】

    题意: 计算一个整数最多可以拆分为多少个合数(要求拆分的全是合数).例如:12的拆分法案是12=4+4+4. 合数是指除了1之外的非素数(正整数). 思路: 偶数的话用4.6就可以满足,奇数的话减去一 ...

  2. 1: 介绍Prism5.0(纯汉语版)

      Prism帮助更简单的设计丰富,灵活,易维护的WPF桌面程序.其中使用MVVM,组合式视图,事件聚合等设计模式.这很符合一些重要的架构设计及原则.帮助你创建一个模块化的应用程序——可以独立开发松耦 ...

  3. 通过网页或Serverice远程系统网站(服务)所在服务器本地的应用程序(未成功)

    近日接了一个奇葩需求,内容如题. 实现过程中遇到一些问题,特将实现过程记录于此,供备忘及参考. 首先尝试了正常启动进程的方法,代码如下: public string RunSPApp() { Proc ...

  4. APUE学习笔记——3.10文件共享

    基本概念 内核使用3个数据结构描述一个打开的文件:进程表.文件表.V节点表 首先了解3种数据结构的概念     1 进程表         每一个进程有一个进程表.进程表里是一组打开的文件描述符,如标 ...

  5. 20165202 2017-2018-2 《Java程序设计》第7周学习总结

    20165202 2017-2018-2 <Java程序设计>第7周学习总结 教材学习内容总结 Ch11 连接MySQL数据库 下载JDBC-MySQL数据库驱动 加载JDBC-MySQL ...

  6. 【这些年】Linux C/C++软件开发用过的工具

          这些年一直从事Linux下C/C++软件开发,学习工作中用到了不少开发工具,一直想做个总结,却总是因为这个原因那个原因,未能动笔.趁今天天气凉爽,空气清新,花点儿功夫,做一个小结啦,防止以 ...

  7. asp.net button浏览器端事件和服务器端事件

    OnClientClick:触发浏览器端的响应,OnClick触发服务器端响应; 在服务器aspx.cs脚本中设置按钮属性: this.btnTest.Attributes["OnClick ...

  8. Shell 命令行获取本机IP,grep的练习

    Shell 命令行获取本机IP,grep的练习 在 mac 下面输入 ifconfig 或者在 linux 下面输入 ip a 就可以得到我们的网卡信息.不过通常情况下,我们需要查看的是我们的IP地址 ...

  9. Kotlin Reference (二) Idioms

    most from reference 一些常用操作 创建单例类 object 数据类data classList.Map.Array的简单操作Lazy延迟加载属性空类型?空类型表达式?..?:.?. ...

  10. 跟着小程学微服务-Mock自动化系统的原理及实现

    一.前言 在之前的文章 http://blog.csdn.net/u013970991/article/details/54862772 中已经介绍了"自动化Mock系统0.9版本" ...