Spring编程<三>
来源:互联网 发布:淘宝怎么找内部优惠券 编辑:程序博客网 时间:2024/06/05 15:32
Spring编程<三>
AOP切面技术——版本1
AOP的公式:
**AOP 的一个公式 : 切面 = 切点+通知
Aspect = Pointcut(拦截哪个/些 函数) + advice(在哪个时间点拦截 before,after,around)**
演示代码:
被代理的对象:
JAVA实验代码:
// 纯Java代码方式实现AOP @Test public void t1() { // 1、被代理对象---原型对象 Person p = new Person(); // 2、实现代理的类 // ProxyFactory f= new ProxyFactory();低版本 不建议使用 // Bean的代理工厂 ProxyFactoryBean factory = new ProxyFactoryBean(); // 3、给代理工厂设置被代理的对象(代理的目标) factory.setTarget(p); // 切面 = 切点+通知 // 4、定义切点 JdkRegexpMethodPointcut cut = new JdkRegexpMethodPointcut(); // 5、为切点设置正则表达式 cut.setPattern(".*run.*");//.*代表所有 // 6、定义通知 Advice advie = new MethodInterceptor() { @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("前面拦截..."); Object returnValue = invocation.proceed();// 放行 System.out.println("后面拦截..."); return returnValue; } }; // 7、声明切面 Advisor = cut + advice Advisor advisor = new DefaultPointcutAdvisor(cut, advie); // 8、把切面设置到代理工厂中 factory.addAdvisor(advisor); // 9、从代理工厂中获取代理后的对象 Person p2 = (Person) factory.getObject(); // 10、用代理后的对象执行方法,如果符合规则,就拦截 p2.run(); }
指定拦截前还是后:
@Test public void t2() { ProxyFactoryBean factory = new ProxyFactoryBean(); factory.setTarget(new Person()); // 切面 = 切点+通知 JdkRegexpMethodPointcut cut = new JdkRegexpMethodPointcut(); cut.setPatterns(new String[] { ".*hello.*", ".*run.*" }); // 注意 Advice都是用的AOP包的接口 Advice before = new MethodBeforeAdvice() { @Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("before拦截..."); } }; // 声明切面 1 Advisor = cut + advice Advisor advisor1 = new DefaultPointcutAdvisor(cut, before); // 方法执行完毕 Advice after = new AfterReturningAdvice() { @Override public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("after拦截(方法执行完毕)..."); } }; // 声明切面2 Advisor = cut + advice Advisor advisor2 = new DefaultPointcutAdvisor(cut, after); // 8、把切面设置到代理工厂中 factory.addAdvisor(advisor1); factory.addAdvisor(advisor2); // 9、从代理工厂中获取代理后的对象 Person p2 = (Person) factory.getObject(); // 10、用代理后的对象执行方法,如果符合规则,就拦截 p2.run(); p2.hello(); }
演示结果:
用XML形式完成:
配置文件v1.xml
<bean id="p" class="cn.hncu.v1.Person"> </bean> <!-- class:这里是用alt+/代码补全的包 ,如果无法补全,请参考下面--> <bean id="cut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"> <property name="pattern" value=".*run.*"></property> </bean> <bean id="aroundAdvice" class="cn.hncu.v1.AroundAdvice"> </bean> <!-- new 一个对象,这里就是一个bean --> <bean id="advisor" class="org.springframework.aop.support.DefaultPointcutAdvisor"> <property name="pointcut" ref="cut"></property> <property name="advice" ref="advisor"></property> </bean> <bean id="personProxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="p"></property> <property name="interceptorNames"> <list> <value>advisor</value> </list> </property> </bean>
手动添加 schema文件,方法如下:
版本可以自行改变,以下是2.5
windwos->preferences->myeclipse->files and editors->xml->xmlcatalog
点击“add”,在出的窗口中的keyttype中选择url,在locationspring-beans-2.5.xsd中选择”file system”,然后spring解压目录的dist/resources目录中选择spring-beans-2.5.xsd,回到设置窗口的时候不要急着关闭窗口,应把窗口中的key type改为schemalocation,key改为http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
演示代码:
@Test public void t1() { ApplicationContext ctx= new ClassPathXmlApplicationContext("cn/hncu/v1/v1.xml"); Person p =ctx.getBean("personProxyFactory", Person.class); p.run();//拦 p.hello();//不拦 }
写一个Advice实现MethodInterceptor
在自己的Advice中写拦截,通过配置文件控制。
public class AroundAdvice implements MethodInterceptor{ @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("前面拦截..."); Object returnValue = invocation.proceed();// 放行 System.out.println("后面拦截..."); return returnValue; }}
阅读全文
0 0
- Spring编程<三>
- spring aop 2.0 编程(三)
- Spring面向切面编程三
- Spring之面向切面编程AOP(三)
- spring系列(三):切面编程(aop)1
- spring,struts,hibernate三大框架编程原理
- 【spring框架】(三)面向切面编程(AOP)
- Spring学习笔记(三)--面向切面编程AoP
- Java网络编程(三) - Spring MVC高级特性
- Spring学习三(AOP面向切面编程)
- spring《三》
- Spring面向切面编程的三种方式以及常用相关案例总结
- Spring 3.x企业开发(三)之AOP面向切面编程
- Learn Spring in spring(三)
- Spring(三、Spring AOP)
- Spring 学习笔记 三
- Spring.Net 框架(三)
- Spring(三)
- 查找对话框
- FM算法(Factorization Machine)
- Java Zip压缩实现
- 台湾大学林轩田机器学习技法课程学习笔记16(完结) -- Finale
- Debug日志:Dev C++ 5.11的 int 型边界测试
- Spring编程<三>
- scrapy-redis 介绍
- Qt Quick学习笔记(二)
- SpringMVC起步--MVC基本概念
- Java 接口
- redis --持久化rio
- jQueryDOM、jQueryAjax
- SQL Server 学习笔记之标识符
- 【iOS】音频播放之AVAudioPlayer,AVPlayer,AVQueuePlayer