代理的三种配置

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. CSS 小结笔记之变形、过渡与动画

    1.过渡 transition  过渡属性用法: transition :ransition-property  transition-duration  transition-timing-func ...

  2. go语言练习:通道、协程

    1.通道的简单例子: package main import "fmt" func main() { channel:=make(chan string) //创建了一个通道对象 ...

  3. .Net core 下的ConfigurationManager类正确引用方法

    大家在项目中经常会用到需要引用配置文件的情况,这也是我偶然间遇到的问题,菜鸟一枚,如有需纠正多谢指点. 正题 在不先引用using的情况下直接写 ConfigurationManager.AppSet ...

  4. 文科妹学 GitHub 简易教程

      #什么是 Github ?必须要放这张图了!!!<img src="https://pic4.zhimg.com/7c9d3403bf922b1663f56975869c829b_ ...

  5. MySQL主从复制异步原理以及搭建

    MySQL主从复制的原理: 1.首先,MySQL主库在事务提交时会把数据变更作为时间events记录在二进制日志文件binlog中:MySQL主库上的sync_binlog参数控制Binlog日志以什 ...

  6. SA387Gr91

    SA387Gr91 在DTCMS中,我做了一个SA387Gr91的网站,挺好看的.

  7. Eclipse 中怎样自动格式化代码?

    首先 有一个 检查代码风格的工具叫checkstyle,具体怎么下载,请自行百度.. 当你在eclipse安装好 checkstyle后,对于使用google标准的人来说,选择一个项目,右键,点击ch ...

  8. XSS详解

    什么是XSS(跨站脚本攻击) XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意html代码或者javascript代码,当用户浏览该页 ...

  9. 将"a"标签当bunton使用

    <a href="javascript:void(0);" style="color: red" onclick="del_product_in ...

  10. linux 的常用命令---------第五阶段

    计划任务 计划任务的作用:做一些周期性的任务,在生产中的主要用来定期备份数据. 计划任务分类  :1.  一次性的任务 仅执行一次就完成了:   使用命令 at 2.  周期性的任务 定期自动执行完成 ...