Spring AOP 创建切面
1、切点类型
- package com.yyq.aop;
- public class Waiter {
- public void greetTo(String name) {
- System.out.println("waiter greet to " + name + ".");
- }
- public void serveTo(String name) {
- System.out.println("waiter serving to " + name + ".");
- }
- }
Seller业务类:
- package com.yyq.aop;
- public class Seller {
- public void greetTo(String name) {
- System.out.println("seller greet to " + name + ".");
- }
- }
GreetingAdvisor切面实现类:
- package com.yyq.aop;
- import org.springframework.aop.ClassFilter;
- import org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor;
- import java.lang.reflect.Method;
- public class GreetingAdvisor extends StaticMethodMatcherPointcutAdvisor {
- @Override
- public boolean matches(Method method, Class<?> aClass) {
- return "greetTo".equals(method.getName());
- }
- public ClassFilter getClassFilter() {
- return new ClassFilter() {
- @Override
- public boolean matches(Class<?> aClass) {
- return Waiter.class.isAssignableFrom(aClass);
- }
- };
- }
- }
GreetingBeforeAdvice前置增强实现类:
- package com.yyq.aop;
- import org.springframework.aop.MethodBeforeAdvice;
- import java.lang.reflect.Method;
- public class GreetingBeforeAdvice implements MethodBeforeAdvice {
- @Override
- public void before(Method method, Object[] objects, Object o) throws Throwable {
- System.out.println(o.getClass().getName() + "." + method.getName());
- String clientName = (String) objects[0];
- System.out.println("Hi! Mr." + clientName + ".");
- }
- }
配置切面:静态方法配置切面
- <?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:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
- <bean id="waiterTarget" class="com.yyq.aop.Waiter"/>
- <bean id="sellerTarget" class="com.yyq.aop.Seller"/>
- <bean id="greetingAdvice" class="com.yyq.aop.GreetingBeforeAdvice"/>
- <bean id="greetingAdvisor" class="com.yyq.aop.GreetingAdvisor" p:advice-ref="greetingAdvice"/>
- <bean id="parent" abstract="true" class="org.springframework.aop.framework.ProxyFactoryBean"
- p:interceptorNames="greetingAdvisor"
- p:proxyTargetClass="true"/>
- <bean id="waiter" parent="parent" p:target-ref="waiterTarget"/>
- <bean id="seller" parent="parent" p:target-ref="sellerTarget"/>
- </beans>
测试方法:
- @Test
- public void testAdvisor(){
- String configPath = "com\\yyq\\aop\\beans.xml";
- ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
- Waiter waiter = (Waiter)ctx.getBean("waiter");
- Seller seller = (Seller)ctx.getBean("seller");
- waiter.greetTo("John");
- waiter.serveTo("John");
- seller.greetTo("John");
- }
- <bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
- p:advice-ref="greetingAdvice">
- <property name="patterns">
- <list>
- <value>.*greet.*</value>
- </list>
- </property>
- </bean>
- <bean id="waiter1" class="org.springframework.aop.framework.ProxyFactoryBean"
- p:interceptorNames="regexpAdvisor"
- p:target-ref="waiterTarget"
- p:proxyTargetClass="true"/>
测试方法:
- @Test
- public void testAdvisor2(){
- String configPath = "com\\yyq\\aop\\beans.xml";
- ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
- Waiter waiter = (Waiter)ctx.getBean("waiter1");
- waiter.greetTo("John");
- waiter.serveTo("John");
- }
- package com.yyq.aop;
- import org.springframework.aop.ClassFilter;
- import org.springframework.aop.support.DynamicMethodMatcherPointcut;
- import java.lang.reflect.Method;
- import java.util.ArrayList;
- import java.util.List;
- public class GreetingDynamicPointcut extends DynamicMethodMatcherPointcut {
- private static List<String> specialClientList = new ArrayList<String>();
- static {
- specialClientList.add("John");
- specialClientList.add("Tom");
- }
- public ClassFilter getClassFilter() {
- return new ClassFilter() {
- @Override
- public boolean matches(Class<?> aClass) {
- System.out.println("调用getClassFilter()对" + aClass.getName() + "做静态检查。");
- return Waiter.class.isAssignableFrom(aClass);
- }
- };
- }
- public boolean matches(Method method, Class clazz) {
- System.out.println("调用matches(method,clazz)" + clazz.getName() + "." + method.getName() + "做静态检查。");
- return "greetTo".equals(method.getName());
- }
- @Override
- public boolean matches(Method method, Class<?> aClass, Object[] objects) {
- System.out.println("调用matches(method,aClass)" + aClass.getName() + "." + method.getName() + "做动态检查。");
- String clientName = (String)objects[0];
- return specialClientList.contains(clientName);
- }
- }
Spring动态检查机制:在创建代理时对目标类的每个连接点使用静态切点检查,如果仅通过静态切点检查就可以知道连接点是不匹配的,则在运行时就不再进行动态检查了;如果静态切点检查时匹配的,在运行时才进行动态切点检查。
- <bean id="dynamicAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
- <property name="pointcut">
- <bean class="com.yyq.aop.GreetingDynamicPointcut"/>
- </property>
- <property name="advice">
- <bean class="com.yyq.aop.GreetingBeforeAdvice"/>
- </property>
- </bean>
- <bean id="waiter2" class="org.springframework.aop.framework.ProxyFactoryBean"
- p:interceptorNames="dynamicAdvisor"
- p:target-ref="waiterTarget"
- p:proxyTargetClass="true"/>
测试方法:
- @Test
- public void testAdvisor3(){
- String configPath = "com\\yyq\\aop\\beans.xml";
- ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
- Waiter waiter = (Waiter)ctx.getBean("waiter2");
- waiter.serveTo("Peter");
- waiter.greetTo("Peter");
- waiter.serveTo("John");
- waiter.greetTo("John");
- }
- package com.yyq.aop;
- public class WaiterDelegate {
- private Waiter waiter;
- public void service(String clientName){
- waiter.greetTo(clientName);
- waiter.serveTo(clientName);
- }
- public void setWaiter(Waiter waiter){
- this.waiter = waiter;
- }
- }
配置控制流程切面:
- <bean id="controlFlowPointcut" class="org.springframework.aop.support.ControlFlowPointcut">
- <constructor-arg type="java.lang.Class" value="com.yyq.aop.WaiterDelegate"/>
- <constructor-arg type="java.lang.String" value="service"/>
- </bean>
- <bean id="controlFlowAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor"
- p:pointcut-ref="controlFlowPointcut"
- p:advice-ref="greetingAdvice"/>
- <bean id="waiter3" class="org.springframework.aop.framework.ProxyFactoryBean"
- p:interceptorNames="controlFlowAdvisor"
- p:target-ref="waiterTarget"
- p:proxyTargetClass="true"/>
测试方法:
- @Test
- public void testAdvisor4(){
- String configPath = "com\\yyq\\aop\\beans.xml";
- ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
- Waiter waiter = (Waiter)ctx.getBean("waiter3");
- WaiterDelegate wd = new WaiterDelegate();
- wd.setWaiter(waiter);
- waiter.serveTo("Peter");
- waiter.greetTo("Peter");
- wd.service("Peter");
- }
- package com.yyq.aop;
- import org.springframework.aop.Pointcut;
- import org.springframework.aop.support.ComposablePointcut;
- import org.springframework.aop.support.ControlFlowPointcut;
- import org.springframework.aop.support.NameMatchMethodPointcut;
- public class GreetingComposablePointcut {
- public Pointcut getIntersectionPointcut(){
- ComposablePointcut cp = new ComposablePointcut();
- Pointcut pt1 = new ControlFlowPointcut(WaiterDelegate.class,"service");
- NameMatchMethodPointcut pt2 = new NameMatchMethodPointcut();
- pt2.addMethodName("greetTo");
- return cp.intersection(pt1).intersection((Pointcut)pt2);
- }
- }
配置复合切点切面:
- <bean id="gcp" class="com.yyq.aop.GreetingComposablePointcut"/>
- <bean id="composableAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor"
- p:pointcut="#{gcp.intersectionPointcut}"
- p:advice-ref="greetingAdvice"/>
- <bean id="waiter4" class="org.springframework.aop.framework.ProxyFactoryBean"
- p:interceptorNames="composableAdvisor"
- p:target-ref="waiterTarget"
- p:proxyTargetClass="true"/>
测试方法:
- @Test
- public void testAdvisor5(){
- String configPath = "com\\yyq\\aop\\beans.xml";
- ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
- Waiter waiter = (Waiter)ctx.getBean("waiter4");
- WaiterDelegate wd = new WaiterDelegate();
- wd.setWaiter(waiter);
- waiter.serveTo("Peter");
- waiter.greetTo("Peter");
- wd.service("Peter");
- }
- <bean id="introduceAdvisor"
- class="org.springframework.aop.support.DefaultIntroductionAdvisor">
- <constructor-arg>
- <bean class="com.yyq.advice.ControllablePerformanceMonitor" />
- </constructor-arg>
- </bean>
- <bean id="forumServiceTarget" class="com.yyq.advice.ForumService" />
- <bean id="forumService" class="org.springframework.aop.framework.ProxyFactoryBean"
- p:interceptorNames="introduceAdvisor"
- p:target-ref="forumServiceTarget"
- p:proxyTargetClass="true"/>
Spring AOP 创建切面的更多相关文章
- 详细解读 Spring AOP 面向切面编程(二)
本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...
- spring AOP面向切面编程学习笔记
一.面向切面编程简介: 在调用某些类的方法时,要在方法执行前或后进行预处理或后处理:预处理或后处理的操作被封装在另一个类中.如图中,UserService类在执行addUser()或updateUse ...
- 【spring-boot】spring aop 面向切面编程初接触--切点表达式
众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...
- 【spring-boot】spring aop 面向切面编程初接触
众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...
- 【Spring系列】Spring AOP面向切面编程
前言 接上一篇文章,在上午中使用了切面做防重复控制,本文着重介绍切面AOP. 在开发中,有一些功能行为是通用的,比如.日志管理.安全和事务,它们有一个共同点就是分布于应用中的多处,这种功能被称为横切关 ...
- 从源码入手,一文带你读懂Spring AOP面向切面编程
之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代 ...
- Spring AOP 面向切面编程入门
什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.众所周知,OOP(面向对象编程)通过的是继承.封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的 ...
- 详细解读 Spring AOP 面向切面编程(一)
又是一个周末, 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之. ...
- 阿里四面:你知道Spring AOP创建Proxy的过程吗?
Spring在程序运行期,就能帮助我们把切面中的代码织入Bean的方法内,让开发者能无感知地在容器对象方法前后随心添加相应处理逻辑,所以AOP其实就是个代理模式. 但凡是代理,由于代码不可直接阅读,也 ...
随机推荐
- 微软Hololens学院教程-Hologram 220-空间声音(Spatial sound )【本文是老版本,与最新的微软教程有出入】
这是老版本的教程,为了不耽误大家的时间,请直接看原文,本文仅供参考哦! 原文链接https://developer.microsoft.com/EN-US/WINDOWS/HOLOGRAPHIC/ho ...
- discuz之同步登入
前言 首先感谢dozer学长吧UCenter翻译成C# 博客地址----------->http://www.dozer.cc/ 其次感谢群友快乐々止境同学的热心指导,虽然萍水相逢但让我 ...
- JS 学习笔记--10---基本包装类型
练习中使用的浏览器是IE10,如果有什么错误或者不同意见,希望各位朋友能够指正,练习代码附在后面 1.基本包装类型: 首先是基本类型,但又是特殊的引用类型,因为他们可以调用系统的方法,这种类型就 ...
- jquery ajax/post/get 传参数给 mvc的action
jquery ajax/post/get 传参数给 mvc的action1.ActionResult Test1 2.View Test1.aspx3.ajax page4.MetaObjec ...
- Mac中安装maven3.2.1
Mac中安装maven3.2.1 原文链接:http://blog.csdn.net/f_zongjian/article/details/24144803 本机OS X:10.9,未安装XCode, ...
- 图解JavaScript执行环境结构
JavaScript引擎在开始编译代码的时候,会对JavaScript代码进行一次预编译,生成一个执行环境,比如如下代码: window.onload=function(){ function sub ...
- acdream1116 Gao the string!(hash二分 or 后缀数组)
问题套了一个斐波那契数,归根结底就是要求对于所有后缀s[i...n-1],所有前缀在其中出现的总次数.我一开始做的时候想了好久,后来看了别人的解法才恍然大悟.对于一个后缀来说 s[i...n-1]来说 ...
- ZOJ3720 Magnet Darts(点在多边形内)
第一道点在多边形内的判断题,一开始以为是凸的.其实题意很简单的啦,最后转化为判断一个点是否在一个多边形内. 如果只是简单的凸多边形的话,我们可以枚举每条边算下叉积就可以知道某个点是不是在范围内了.但对 ...
- poj 2348
Euclid's Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7418 Accepted: 3022 Des ...
- jxl.dll操作总结
1)Jxl是一个开源的Java Excel API项目,通过Jxl,Java可以很方便的操作微软的Excel文档.除了Jxl之外,还有Apache的一个POI项目,也可以操作Excel,两者相比之下: ...