JavaEE笔记(十二)
代理的三种配置
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笔记(十二)的更多相关文章
- 《C++游戏开发》笔记十二 战争迷雾:初步实现
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- DirectX11笔记(十二)--Direct3D渲染8--EFFECTS
原文:DirectX11笔记(十二)--Direct3D渲染8--EFFECTS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737 ...
- java jvm学习笔记十二(访问控制器的栈校验机制)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...
- (C/C++学习笔记) 十二. 指针
十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...
- 《深入理解Java虚拟机》读书笔记十二
第十二章 Java内存模型与线程 1.硬件效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cac ...
- swift 笔记 (十二) —— 下标
下标 swift同意我们为 类.结构体,枚举 定义下标,以更便捷的方式訪问一大堆属性.比方Array和Dictionary都是结构体,swift的project师已经为这两个类型提供好了下标操作的代码 ...
- JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)
1.作为命名空间的函数 有时候我们需要声明很多变量.这样的变量会污染全局变量并且可能与别人声明的变量产生冲突. 这时.解决办法是将代码放入一个函数中,然后调用这个函数.这样全局变量就变成了 局部变量. ...
- MySQL学习笔记十二:数据备份与恢复
数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql ...
随机推荐
- Flutter dart:convert
引用 mport 'dart:convert'; JSON 解码(JSON String->Object) // NOTE: Be sure to use double quotes (&quo ...
- AutoCompleteTextView 自定义提示样式
项目中用到AutoCompleteTextView 自动提示功能,如果用自带的ArrayAdapter就一种样式,非常丑,而且每一项提示文字过多的话不会自动换行. 所以自己自定义了一个适配器. 效果 ...
- 从零自学Java-5.使用条件测试进行判断
1.使用if语句进行最基本的条件测试:2.测试一个值大于还是小于另一个值:3.测试两个值是否相等:4.使用与if语句对应的else语句:5.组合多个条件测试:6.使用switch语句进行复杂的条件测试 ...
- Python字符串和编码
在最早的时候只有127个字符被编码到计算机里,也就是大小写英文字母.数字和一些符号,这个编码被成为ASCII编码. 但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突 ...
- Mbps Mb M Kb如何换算
在传输单位的写法上,B 和 b 分别代表 Bytes 和 bits,两者的定义是不同的,具体换算公式如下:1 Byte = 8 bits 1 Kb = 1024 bits 1 KB = 1024 by ...
- 虚拟机压力测试延迟高的可能原因及 ILPIP 配置 / 查询脚本
测试初期 Client VM 的延迟结果正常: 测试后期 Client VM 的延迟偶尔突增/连接失败,越后期超高延迟(比如 30 秒)出现越多: 问题分析 造成这一现象的根本原因很可能是 SNAT( ...
- 简单实现MySQL数据库的日志审计
时间 2018-12-23 08:01:11 FreeBuf 原文 https://www.freebuf.com/articles/es/192062.html 主题 MySQL 0×0 背景 ...
- centos7 安装ldap
ldap首先我们要知道这个ldap的概念, LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写 目录是一个为查询.浏览和搜索而优化的专业分布 ...
- Django之MVC与MTV
MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写 模型 - 视图 - 控制器是一种通常用于开发用户界面的 ...
- LINE学习
LINE Abstract LINE 是一种将大规模网络结点表征成低维向量的算法,可很方便用于网络可视化,结点分类,链路预测,推荐. source code Advantage LINE相比于其他算法 ...