spring的aop的例子
- package aop;
 - /**
 - * 目标对象的接口
 - */
 - public interface Student {
 - public void addStudent(String name);
 - }
 
package aop;  /**     * 目标对象的接口    */   public interface Student {   public void addStudent(String name);  }    
- package aop;
 - /**
 - * 目标对象
 - */
 - public class StudentImpl implements Student {
 - public void addStudent(String name) {
 - System.out.println(" 欢迎 " + name + " 你加入);
 - }
 - }
 
package Spring家庭! "); } }
- package aop;
 - import java.lang.reflect.Method;
 - import org.springframework.aop.MethodBeforeAdvice;
 - /**
 - * 前置通知
 - */
 - public class BeforeAdvice implements MethodBeforeAdvice {
 - public void before(Method method, Object[] args, Object target)
 - throws Throwable {
 - System.out.println(" 这是BeforeAdvice类的before方法. ");
 - }
 - }
 
package aop.MethodBeforeAdvice;    /**   * 前置通知   */  public class BeforeAdvice implements MethodBeforeAdvice {     public void before(Method method, Object[] args, Object target)     throws Throwable {      System.out.println(" 这是BeforeAdvice类的before方法. ");     }  }  
- package aop;
 - import java.lang.reflect.Method;
 - import org.springframework.aop.AfterReturningAdvice;
 - /**
 - * 后置通知
 - */
 - public class AfterAdvice implements AfterReturningAdvice {
 - public void afterReturning(Object returnValue, Method method,
 - Object[] args, Object target) throws Throwable {
 - System.out.println("这是AfterAdvice类的afterReturning方法.");
 - }
 - }
 
package aop.AfterReturningAdvice;    /**   * 后置通知   */  public class AfterAdvice implements AfterReturningAdvice {     public void afterReturning(Object returnValue, Method method,     Object[] args, Object target) throws Throwable {    System.out.println("这是AfterAdvice类的afterReturning方法.");   }    }  
- package aop;
 - import org.aopalliance.intercept.MethodInterceptor;
 - import org.aopalliance.intercept.MethodInvocation;
 - /**
 - * 环绕通知
 - */
 - public class CompareInterceptor implements MethodInterceptor {
 - public Object invoke(MethodInvocation invocation) throws Throwable {
 - Object result = null;
 - String stu_name = invocation.getArguments()[0].toString();
 - if (stu_name.equals("dragon")) {
 - // 如果学生是dragon时,执行目标方法,
 - result = invocation.proceed();
 - } else {
 - System.out.println("此学生是" + stu_name + "而不是dragon,不批准其加入.");
 - }
 - return result;
 - }
 - }
 
package
- version="1.0" encoding="UTF-8"?>
 - <!DOCTYPE beans PUBLIC "-//spring-beans.dtd">
 - id="beforeAdvice"
 - class="id
 - ="afterAdvice" class="id="compareInterceptor" class="id
 
="studenttarget" class="id="student"
- class="org.springframework.aop.framework.ProxyFactoryBean">
 - name="proxyInterfaces">
 - aop.Student
 - name="interceptorNames"
 - >
 
- name="target"
 - >
 
- bean="studenttarget"
 - />
 
- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//
- package
 
aop;
 
- import org.springframework.context.ApplicationContext;
 
- import org.springframework.context.support.FileSystemXmlApplicationContext;
 
- /**
 
- * 测试代码
 
- */
 
- public class Test {
 
- public static void main(String[] args) {
 
- ApplicationContext ctx = new FileSystemXmlApplicationContext("/src/applicationContext.xml");
 
- Student s = (Student)ctx.getBean("student");
 
- s.addStudent("aaa");
 - }
 - }
 *****************************************************************************************************
Spring AOP实例二
最近在研究aop,看了点资料,总结如下:
所谓AOP就是将分散在各个方法处的公共代码提取到一处,并通过类似拦截器的机制实现代码的动态整合。可以简单地想象成,在某个方法的调用前、执行中、调用后和抛出异常时,动态插入自己的代码。网上碰到个例子还不错,整理了一下:
首先看一个简单的spring IOC例子:
用户买书接口:
- package aop;
 - public interface BuyBook {
 - public void buyBook(String customer,String book)throws NoBookException;
 - }
 
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; 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("小东", "《楚留香》");
 - }
 - }
 
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
- version="1.0" encoding="UTF-8"?>
 - <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 - id="newBuyBook"
 - class="aop.BuyBookImpl"/>
 
- <?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+"!");
 - }
 - }
 
- <?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>
 
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:
- version="1.0" encoding="UTF-8"?>
 - <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 - id="buyBook"
 - class="aop.BuyBookImpl"/>
 
- id="myBeforeAdvice" class="aop.MyBeforeAdvice"/>
 - id="newBuyBook" class="org.springframework.aop.framework.ProxyFactoryBean">
 - name="proxyInterfaces" value="aop.BuyBook"/>
 - name="interceptorNames">
 
- name="target"
 - ref="buyBook"/>
 
- <?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]);
 - }
 - }
 
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:
- version="1.0" encoding="UTF-8"?>
 - <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 - id="buyBook"
 - class="aop.BuyBookImpl"/>
 
- id="myBeforeAdvice" class="aop.MyBeforeAdvice"/>
 - id="myAfterAdvice" class="aop.MyAfterAdvice"/>
 - id="newBuyBook" class="org.springframework.aop.framework.ProxyFactoryBean">
 - name="proxyInterfaces" value="aop.BuyBook"/>
 - name="interceptorNames">
 
- name="target"
 - ref="buyBook"/>
 
- <?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!小东三、修改原来方法的内容,比如加入相关业务判断,一个人只能买一本书:
修改用户买书类:packageaop;
 
- 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》");
 - }
 - }
 
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:
- 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;
 - }
 - }
 
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:
- version="1.0" encoding="UTF-8"?>
 - <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 - id="buyBook"
 - class="aop.BuyBookImpl"/>
 
- id="myMethodInterceptor" class="aop.MyMethodInterceptor"/>
 - id="newBuyBook" class="org.springframework.aop.framework.ProxyFactoryBean">
 - name="proxyInterfaces" value="aop.BuyBook"/>
 - name="interceptorNames">
 
- name="target"
 - ref="buyBook"/>
 
- <?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>
运行结果:
小东你好!你成功购了一本《楚留香》!
注意,一名顾客只能买一本打折书! 
spring的aop的例子的更多相关文章
- Spring AOP 学习例子
		
http://outofmemory.cn/code-snippet/3762/Spring-AOP-learn-example 工作忙,时间紧,不过事情再多,学习是必须的.记得以前的部门老大 ...
 - Spring基于AOP的事务管理
		
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
 - Spring实现AOP的4种方式
		
了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“ ...
 - Spring的AOP与代理
		
spring 支持两种注入方式: setter/constructor 支持多种配置方式: xml/java5注解/java类配置 支持两种事务管理: 声明性/编程性 实际上上述方式只有一个就能保证系 ...
 - Spring实现AOP的4种方式(转)
		
转自:http://blog.csdn.net/udbnny/article/details/5870076 Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定 ...
 - Spring学习笔记(二)Spring基础AOP、IOC
		
Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...
 - Spring中AOP简介与切面编程的使用
		
Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操 ...
 - Spring之AOP二
		
在Spring之AOP一中使用动态代理将日志打印功能注入到目标对象中,其实这就是AOP实现的原理,不过上面只是Java的实现方式.AOP不管什么语言它的几个主要概念还是有必要了解一下的. 一.AOP概 ...
 - Spring【AOP模块】就是这么简单
		
前言 到目前为止,已经简单学习了Spring的Core模块.....于是我们就开启了Spring的AOP模块了...在讲解AOP模块之前,首先我们来讲解一下cglib代理.以及怎么手动实现AOP编程 ...
 
随机推荐
- spring boot 自定义视图路径
			
boot 自定义访问视图路径 . 配置文件 目录结构 启动类: html页面 访问: 覆盖boot默认路径引用. 如果没有重新配置,则在pom引用模板. 修改配置文件. 注意一定要编译工程
 - 14.纯 CSS 创作一种侧立图书的特效
			
原文地址:https://segmentfault.com/a/1190000014751037 HTML代码: <div class="books"> <div ...
 - tomcat gzip
			
----------- HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览.相对于普通的浏览过程HTM ...
 - c# 和 java <转载>http://www.cnblogs.com/zhucai/archive/2011/02/16/csharp-compare-java.html
			
从语法层面来讲,c# 和 java 是非常相似的. <转载> 这篇文章对C#与Java做一个语言级的对比,方便C#转Java或Java转C#的人有个大致了解.这里大致用C#3.0与Java ...
 - python3自动生成并运行bat批处理,并重定向输入消除黑窗口
			
#coding:utf-8import os #bat文件的内容(temp.bat)bat_name='temp.bat's1='''echo offipconfigecho Hello world! ...
 - xml文件中的${}
			
看到了${}这样的表达式,脑海里面第一印象是不是我们jsp中的EL表达式?! 哈哈... 不过,这个真不是EL表达式,Spring提供了自己的EL表达式,可是它的格式是#{} so.... ${key ...
 - jqGrid pivot获取所有行包括小计数据及原码分析
			
1.结论:按正常jqGid获取,在中间加入以下代码,即将小计行当成改变为普能行,以便能让'getRowData'方法获取到,第三点会进行原码分析 //get all page grid data,in ...
 - leetcode999
			
class Solution: def numRookCaptures(self, board: 'List[List[str]]') -> int: basei = 0 basej = 0 r ...
 - 推荐一款idea 翻译插件 ECTranslation
			
无意中看到一款idea翻译插件, ECTranslation,才知道有这么个东西,推荐给看到的人吧,使用简单,值得拥有. 参考:http://p.codekk.com/detail/Android/S ...
 - vue  设置背景
			
<span :style="{ 'background': 'url(' + aboutImg1 + ') no-repeat center center', 'background- ...