zoukankan      html  css  js  c++  java
  • cglib动态代理(即AOP)

    Computer.java 
    package com.wh.spring_aop;
    
    public class Computer {
    
    	public void playLOL(){
    		System.out.println("LOL进行中...");
    	}
    	
    	public String result(boolean flag){
    		System.out.println("公布比赛结果...");
    		if(flag){
    			return "您赢了";
    		}else{
    			int a=10/0;
    			return "您输了";
    		}
    	}
    	
    	
    }
    

    AopProxy.java

    package com.wh.spring_aop;
    
    import org.aspectj.lang.JoinPoint;
    
    /**
     * 完成AOP的步骤
    		1、切入点程序。
    		2、切面程序。
    		3、通过配置文件将切面程序插入到切入点程序的某个位置上(通知)
     *
     */
    public class AopProxy {
    
    	public void addBefore(JoinPoint jp){
    		System.out.println("AOP前置通知!");
    	}
    	
    	public void addAfterReturn(Object returnResult){
    		if(returnResult!=null){
    			System.out.println("AOP后置通知!"+returnResult);
    		}
    		System.out.println("AOP后置通知");
    	}
    	
    	public void addAfter(){
    		System.out.println("AOP最终通知");
    	}
    	
    	public void addThrow(Throwable e){
    		System.out.println("AOP异常通知	异常信息是:  "+e.getMessage());
    	}
    	
    }
    

    applicationContext.xml

    <?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:mvc="http://www.springframework.org/schema/mvc"
    	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:c="http://www.springframework.org/schema/c" xmlns:cache="http://www.springframework.org/schema/cache"
    	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
    		http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd
    		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
    
    	<bean id="computer" class="com.wh.spring_aop.Computer" />
    	<bean id="aopProxy" class="com.wh.spring_aop.AopProxy" />
    	
    	<aop:config>
    		<!-- 虽然返回值类型可以任意   方法名任意    参数类型任意  ,但是参数个数不是任意的,有几个星号就代表有几个参数,参数个数不匹配,则不会执行aop -->
    		<aop:pointcut expression="execution(* com.wh.spring_aop.Computer.*(*))" id="computerCut" /><!--此处为切入点  -->
    		<aop:aspect ref="aopProxy"><!-- 此处为切面 -->
    			<!-- AOP前置通知 -->
    			<aop:before method="addBefore" pointcut-ref="computerCut" /><!-- 此处为通知 -->
    			<!-- AOP后置通知:在目标组件的方法正常执行并返回参数后执行的程序。
    				  切面程序:后置通知的切面程序中可以获取到目标方法返回参数,但需要在配置文件中声明参数名,依赖spring容器注入参数值。
    				 returning="returnResult"里的值要与AopProxy里的方法里的参数名一致,否则报错
    			 -->
    			<aop:after-returning method="addAfterReturn" pointcut-ref="computerCut" returning="returnResult"/>
    			<!-- AOP异常通知:在目标组件的方法抛出异常信息后执行的程序。
    				 切面程序:异常通知的切面程序中可以获取到目标组件抛出的异常信息,需要在配置文件上声明异常参数名,依赖spring容器注入参数值。
    			 -->
    			<aop:after-throwing  method="addThrow" pointcut-ref="computerCut" throwing="e"/>
    			<!-- AOP最终通知:在目标组件的方法正常执行后执行,或在异常通知之前执行。  -->
    			<aop:after method="addAfter" pointcut-ref="computerCut"/>
    			
    		</aop:aspect>
    	</aop:config>
    	
    </beans>
    

    TestMVC.java

    package com.wh.spring_aop;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class TestMVC {
    
    	@Test
    	public void test01(){
    		@SuppressWarnings("resource")
    		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    		Computer computer =(Computer)ac.getBean("computer");
    		//computer.playLOL();
    		computer.result(false);
    	}
    
    
    }
    

    运行结果:

      AOP前置通知!
      公布比赛结果...
      AOP异常通知 异常信息是: / by zero
      AOP最终通知

      

      

      

  • 相关阅读:
    SpringCloud源码解读
    深度剖析Dubbo源码
    十大经典排序算法
    详细介绍Spring 5的那些新特性与增强
    Spring4.x所有Maven依赖
    常见的接口与类 -- Comparable
    java序列化测试
    什么是Java序列化?为什么序列化?序列化有哪些方式?
    java堆、栈、堆栈的区别
    IntelliJ IDEA常用快捷键汇总
  • 原文地址:https://www.cnblogs.com/1020182600HENG/p/6864152.html
Copyright © 2011-2022 走看看