代理的三种配置

beans配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <bean id="IStudentService" class="com.my.servic.impl.StudentServiceImpl"></bean>
<bean id="IEmpService" class="com.my.servic.impl.EmpServiceImpl"></bean>
<bean id="logAdivce" class="com.my.advice.LogAdivce"></bean>
<bean id="customerAdvice" class="com.my.advice.CustomerAdvice"></bean>
<bean id="annotationAdvice" class="com.my.advice.AnnotationAdvice"></bean>
<aop:config>
<aop:pointcut expression="execution(* com.my.servic.impl.*.*(..))"
id="pointcut" />
<aop:advisor advice-ref="logAdivce" pointcut-ref="pointcut" />
</aop:config>
<!-- 自定义配置通知 --> <aop:config>
<aop:aspect ref="customerAdvice">
<aop:pointcut expression="execution(*
com.my.servic.impl.*.add(..))"
id="pointcut1" />
<aop:pointcut expression="execution(*
com.my.servic.impl.*.delete(..))"
id="pointcut2" />
<aop:around method="roundMethod" pointcut-ref="pointcut1" />
<aop:before method="methodBefore" pointcut-ref="pointcut1" />
<aop:after method="methodAfter" pointcut-ref="pointcut2" />
</aop:aspect>
</aop:config> <!-- 扫描注解 组件 -->
<context:component-scan base-package="*"></context:component-scan> <!-- 注解方式 -->
<aop:aspectj-autoproxy /> <!-- 使用ProxyFactoryBean --> <bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>com.my.servic.IStudentService</value>
<value>com.my.servic.IEmpService</value>
</list>
</property> <property name="target">
<ref local="IStudentService" />
</property>
<property name="interceptorNames">
<list>
<value>logAdivce</value>
</list>
</property>
</bean>
</beans>

注解写法

package com.my.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component; @Component
@Aspect
public class AnnotationAdvice { @Before("execution(* com.my.servic.impl.*.*(..))")
public void before(JoinPoint jp){
System.out.println("方法调用前。。");
System.out.println(jp.getTarget()+" +++>>> "+jp.getSignature()+" "+jp.getArgs());
} @Around("execution(* com.my.servic.impl.*.*(..))")
public void round(ProceedingJoinPoint pjp){
System.out.println("环绕前。。");
try {
pjp.proceed();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("环绕后前。。");
} }

自定义写法

package com.my.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint; public class CustomerAdvice { public void methodBefore(JoinPoint jp){
System.out.println("方法调用前。。");
System.out.println(jp.getTarget()+" +++>>> "+jp.getSignature()+" "+jp.getArgs()); } public void methodAfter(JoinPoint jp){
System.out.println("方法调用后。。");
} public void roundMethod(ProceedingJoinPoint pjp){
System.out.println("环绕前。。"); try {
pjp.proceed();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("环绕后。。");
} }

常规实现接口写法

package com.my.advice;

import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date; import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice; import com.my.bean.Emp;
import com.my.bean.Student; public class LogAdivce implements MethodBeforeAdvice, AfterReturningAdvice,
MethodInterceptor { @Override
public void before(Method method, Object[] arg1, Object target)
throws Throwable { SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); System.out.println("目标对象" + target.getClass().getName() + "的"
+ method.getName() + " 在" + sf.format(new Date()) + " 被调用了"); for (Object obj : arg1) { if (obj.getClass().getName().equals("com.my.bean.Student")) {
Student stu = (Student) obj;
System.out.println("参数为:" + stu.getName());
} else if (obj.getClass().getName().equals("com.my.bean.Emp")) {
Emp e = (Emp) obj;
System.out.println("参数为:" + e.getName());
}
}
} @Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
// TODO Auto-generated method stub
} @Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("环绕前。。");
Object obj = methodInvocation.proceed();
System.out.println("环绕后。。");
return obj;
} }

JavaEE笔记(十二)的更多相关文章

  1. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...

  2. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  3. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  4. DirectX11笔记(十二)--Direct3D渲染8--EFFECTS

    原文:DirectX11笔记(十二)--Direct3D渲染8--EFFECTS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737 ...

  5. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

  6. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...

  7. 《深入理解Java虚拟机》读书笔记十二

    第十二章  Java内存模型与线程 1.硬件效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cac ...

  8. swift 笔记 (十二) —— 下标

    下标 swift同意我们为 类.结构体,枚举 定义下标,以更便捷的方式訪问一大堆属性.比方Array和Dictionary都是结构体,swift的project师已经为这两个类型提供好了下标操作的代码 ...

  9. JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)

    1.作为命名空间的函数 有时候我们需要声明很多变量.这样的变量会污染全局变量并且可能与别人声明的变量产生冲突. 这时.解决办法是将代码放入一个函数中,然后调用这个函数.这样全局变量就变成了 局部变量. ...

  10. MySQL学习笔记十二:数据备份与恢复

    数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql ...

随机推荐

  1. Python+Selenium笔记(十一):配置selenium Grid

    (一) 前言 Selenium Grid可以将测试分布在若干个物理或虚拟机器上,从而实现分布方式或并行方式执行测试. 这个链接是官方的相关说明. https://github.com/Selenium ...

  2. cuda和gcc版本不兼容

    gcc8.1和cuda9.0版本不兼容,比较坑. 下面是各版本cuda支持的gcc: 从CUDA 4.1版本开始,现在支持gcc 4.5.gcc 4.6和4.7不受支持. 从CUDA 5.0版本开始, ...

  3. 闲聊jQuery(一)

    Write less, do more. 这便是jQuery的宗旨!jQuery,一个高效.精简并且功能丰富的 JavaScript 工具库. 想必,对于每一个前端开发者,一定用过jQuery吧!俗话 ...

  4. cmd 命令总结

    1.windows 系统定时关机  定时关机:shutdown -s -t 300                 at 18:30 shutdown -s 取消定时:shutdown -a 注意:3 ...

  5. bufferIO,Direct io,mmap, ZeroCopy

    1 bufferIO(传统IO),Direct io(干掉内核cache),mmap(大数据映射),zeroCopy(网络IO) 2 linux 5种IO 3NIO 相关知识 这张图展示了mmap() ...

  6. Python3部分Print输出格式

    print("Hello World!") #直接打印字符串 print('Hello World!') #对于python,单引号也可以表示字符串 name = 'Tom' #自 ...

  7. 一个服务器多个tomcat的配置

    下面我们把配置的详细过程写在下面,以供参考:(此例以配置三个Tomcat为例)1. 下载apache-tomcat-7.0.63,下载下来的文件为apache-tomcat-7.0.63.zip.2. ...

  8. Visual Studio 2012自动添加注释(如版权信息等)

    转自:http://blog.163.com/guohuan88328@126/blog/static/69430778201381553150156/ 如何使用Visual Studio 2012给 ...

  9. Window10 Linux子系统挂载磁盘

    默认情况下, Linux子系统将当前winodws磁盘的盘全部挂载到/mnt/<disk_label>, 但一些新增的盘就需要手动做下了.. 官方参考文档 挂载磁盘 -- DrvFs 挂载 ...

  10. tikv性能参数调优

    tiKV 最底层使用的是 RocksDB(tidb3.0版本中将使用tian存储引擎) 做为持久化存储,所以 TiKV 的很多性能相关的参数都是与 RocksDB 相关的.TiKV 使用了两个 Roc ...