最近在研究aop,看了点资料,总结如下:
所谓AOP就是将分散在各个方法处的公共代码提取到一处,并通过类似拦截器的机制实现代码的动态整合。可以简单地想象成,在某个方法的调用前、执行中、调用后和抛出异常时,动态插入自己的代码。
网上碰到个例子还不错,整理了一下:
首先看一个简单的spring IOC例子:
用户买书接口:
package aop;
public interface BuyBook {
public void buyBook(String customer,String book)throws NoBookException;
}
用户买书的接口实现:
package aop;
public class BuyBookImpl implements BuyBook{
public void buyBook(String customer,String book) {
System.out.println(customer+"你好!你成功购了一本"+book+"!");
}
}
测试用户买书类:
package aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class TestAop {
public static void main(String args[]) throws Exception{
ApplicationContext ctx = new FileSystemXmlApplicationContext("aop.xml");
BuyBook b = (BuyBook)ctx.getBean("newBuyBook");
b.buyBook("小东", "《楚留香》");
}
}
配置文件aop.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="newBuyBook" class="aop.BuyBookImpl"/>
</beans>
此时运行程序仅出现:
小东你好!你成功购了一本《楚留香》!
===================================================================================
AOP ----切面编程
所谓切面编程:在不改变原方法(令为methodA)的定义与使用、也不改变原程序的流程的情况下,变更该methodA的功能。在变更时,最激动人心的时能获得methodA的类的对象,meahtoidA的参数,也可获得mehodA执行的结果,还能得到调用meahtoidA的对象。
简单理解:允许用户在指定地方,插入新的函数,
包括:
1 methodA运行前,执行用户指定的其它方法methodOther,然后返回
2 methodA运行完毕,执行用户指的其它方法methodOther,然后返回
3 在执行methodA的地方,变成执行在用户指定的其它方法methodOther,
在methodOther方法中, methodA运不运行,何时运行,随用户自行安排,然后返回
4 methodA执行出现异常时,执行用户指定的其它方法methodOther,然后返回。
产生动机:
在一个程序中,当我们要 使用一个方法(令为methodA);由于不同的用户对methodA的功能要 求不一样,因此在这个methodA的地方就出现了变化点。所以要在这个变化点上进行封装,留下一个可扩展的接口,便于日后修改维护。
本质:
1 Aop核心是一个适配器,把变动前的方法,与变动后的方法联接在一起。
2 这个适配器实现的核心是动态代理 Proxy机制
3 四个核心子接口:
a MethodBeforeAdvice ----methodA函数调用前执行用户定义的方法
b AfterReturningAdvice ----- methodA函数调后执行用户定义的方法
c MethodInterceptor -------彻底变更MethodA函数为用户定义的方法
d ThrowsAdvice------methodA函数调用出现异常执行用户定义的方法
===================================================================================
下面加入aop的内容:
一、在买书前加入新功能(欢迎光临!小东)
增加类MyBeforeAdvice :
package aop;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class MyBeforeAdvice implements MethodBeforeAdvice{
public void before(Method arg0, Object[] arg1, Object target) throws Throwable {
String customer = (String)arg1[0];
System.out.println("欢迎光临!"+customer+"!");
}
}
修改配置文件aop.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="buyBook" class="aop.BuyBookImpl"/>
<bean id="myBeforeAdvice" class="aop.MyBeforeAdvice"/>
<bean id="newBuyBook" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces" value="aop.BuyBook"/>
<property name="interceptorNames">
<list>
<value>myBeforeAdvice</value>
</list>
</property>
<property name="target" ref="buyBook"/>
</bean>
</beans>
运行后输出结果:
欢迎光临!
小东你好!你成功购了一本《楚留香》!
二、在买书后加入新功能(Good Bye!小东)
增加MyAfterAdvice类:
package aop;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class MyAfterAdvice implements AfterReturningAdvice{
public void afterReturning(Object o1, Method m, Object[] objects, Object o2){
System.out.println("Good Bye!" + objects[0]);
}
}
修改配置文件aop.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="buyBook" class="aop.BuyBookImpl"/>
<bean id="myBeforeAdvice" class="aop.MyBeforeAdvice"/>
<bean id="myAfterAdvice" class="aop.MyAfterAdvice"/>
<bean id="newBuyBook" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces" value="aop.BuyBook"/>
<property name="interceptorNames">
<list>
<value>myBeforeAdvice</value>
<value>myAfterAdvice</value>
</list>
</property>
<property name="target" ref="buyBook"/>
</bean>
</beans>
运行后输出结果:
欢迎光临!
小东你好!你成功购了一本《楚留香》!
Good Bye!小东
三、修改原来方法的内容,比如加入相关业务判断,一个人只能买一本书:
修改用户买书类:
package aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class TestAop {
public static void main(String args[]) throws Exception{
ApplicationContext ctx = new FileSystemXmlApplicationContext("aop.xml");
BuyBook b = (BuyBook)ctx.getBean("newBuyBook");
b.buyBook("小东", "《楚留香》");
b.buyBook("小东", "《楚留香2》");
}
}
增加拦截器类MyMethodInterceptor:
package aop;
import java.util.HashSet;
import java.util.Set;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyMethodInterceptor implements MethodInterceptor{
private Set customers = new HashSet();
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
String customer = (String)invocation.getArguments()[0];
Object result = null;
if(customers.contains(customer)){
System.out.println("注意,一名顾客只能买一本打折书!");
} else{
result = invocation.proceed();
}
customers.add(customer);
return result;
}
}
修改配置文件aop.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="buyBook" class="aop.BuyBookImpl"/>
<bean id="myMethodInterceptor" class="aop.MyMethodInterceptor"/>
<bean id="newBuyBook" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces" value="aop.BuyBook"/>
<property name="interceptorNames">
<list>
<value>myMethodInterceptor</value>
</list>
</property>
<property name="target" ref="buyBook"/>
</bean>
</beans>
运行结果:
小东你好!你成功购了一本《楚留香》!
注意,一名顾客只能买一本打折书!
分享到:
相关推荐
spring2-aop入门实例教程 spring2-aop入门实例教程
用spring AOP做的最简单的日志记录小例子,特别简单,可直接运行。
Spring AOP 入门实例1
aop入门。
NULL 博文链接:https://lijiejava.iteye.com/blog/1180331
NULL 博文链接:https://lynnwoo.iteye.com/blog/718928
一个基于@AspectJ的spring2.0 AOP应用实例,很小很简单,没有任何额外信息,最适合AOP入门学习。使用log4j打印信息。把项目直接import进myeclipse就可以使用啦......
NULL 博文链接:https://rain1109.iteye.com/blog/1838100
spring-boot入门实例(jpa+postgresql+aop实现valid切面式校验)
包内是aop入门的一些小例子。包括java代码和其中用到的xml文件。一个子包(如aop包)里有一个可执行应用程序。
使用spring实现AOP的一个简单实例,很好的一个入门例子
本文主要是介绍SpringAOP的相关知识,在本文里面我能介绍了SpringAOP的实现机理,在实现过程中所用到的相关技术,最后,通过一个简单的实例来对SpringAOP进行实现,进而加读者对SpringAOP的理解,以达到熟练运用的...
采用注解模式,和XML模式对AOP面向切面编程进行测试。
3 IOC:控制反转,谓之“依赖关系的转移”,如果以前都是依赖于实现,那么现在反转为依赖于抽象吧,其实它的核心思想就是要面向接口编程,至于何谓接口何谓抽象,以及它们的好处,多看看设计模式吧,这里就不费口舌...
使用Spring的注解方式实现AOP入门 18.使用Spring的注解方式实现AOP的细节 19.使用Spring配置文件实现AOP 20.aspectj的切入点语法定义细节 21.搭建和配置Spring与jdbc整合的环境 22.Spring集成的jdbc编码和事务...
Spring从入门到精通(第七,十四章) pdf (非影印版) 清华大学出版社 作者:郭锋 ISBN:7302138117 IoC DI AOP的讲解,条理非常清晰,结合实例,简单明了。非常适合初次接触这些概念的人。
本资源通过一个Category和Publisher表的实例,使用Spring框架实现AOP切面编程,其中实现了增删改查的功能,通过事物(tx)管理器、扫描业务逻辑、声明式事务达到切面编程效果。代码中有很详细的备注,适合新手入门
spring实例教程 spring初级入门教程 手把手教你成为spring高手 近30个实例让你成为spring高手涵盖spring的大部分内容:ioc控制反转 aop面向切面编程等