• [置顶] spring切点切面aop——xml非注解


     aop代理就是到了某个方法(被称为“切点”),在执行这个方法之前干什么、之后干什么、异常了有什么等(这些在“切面”中定义)
     <!-- 增加aop头,共五个 -->
     <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:aop="http://www.springframework.org/schema/aop"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:tx="http://www.springframework.org/schema/tx"
          xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
             
               http://www.springframework.org/schema/context 
               http://www.springframework.org/schema/context/spring-context-2.5.xsd
               
                http://www.springframework.org/schema/aop 
               http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
       ">
         <!-- 在spring-context.jar的meta-inf//spring-context.jar中确定xsd是哪个版本 -->
     
        <!-- <context:annotation-config></context:annotation-config> -->
    
        <!-- 告诉spring扫描哪个包,我让他扫描proxy.spring.agent所有的类-->
        

        <context:component-scan base-package="proxy.spring.agent.*"></context:component-scan>
    
     <!-- 定义两个bean类 -->
     <bean id="myAgent" class="proxy.spring.agent.AgentProxy"></bean>
     <bean id="singer" class="proxy.spring.agent.MySinger"></bean>
    
    <!-- 这才是正题,spring aop切点切面就要有切点和切面,下面就是切点pointcut  和切面aspect-->
     <aop:config>
    
      <!-- 定义一个切点 -->
      <!-- execution 表达式第一个表示任意返回类型(public、..),第二个表示proxy.spring.agent.MySinger下的任意方法,*(..)表示任意方法任意参数也就是这个类下的所有方法都会被代理-->
      <aop:pointcut expression="execution(* proxy.spring.agent.MySinger.*(..))" id="point1"/>
      
       <!-- 定义一个切面 -->
      <aop:aspect id="aspect1" ref="myAgent">
      <!-- 这是定义切点之前、之后、抛异常该干什么 -->   
       <aop:before method="before" pointcut-ref="point1"/>
       <aop:after method="after"   pointcut-ref="point1" />
       <aop:after-returning method="afterReturn"  pointcut-ref="point1"/>
       <aop:after-throwing method="afterThrow"   pointcut-ref="point1"/>
       <aop:around method="around"  pointcut-ref="point1"/>
      </aop:aspect>
     </aop:config>
    
    </beans>
    


     

    -----------------------------------------源码例子(歌手做例子)----------------------------------

    -----------------------------------------xml----------------------(歌手和经纪人之间的约定)--------------------------------

    <?xml version="1.0" encoding="UTF-8"?>
    
    
    <beans xmlns="http://www.springframework.org/schema/beans"
    		xmlns:context="http://www.springframework.org/schema/context"
    		xmlns:aop="http://www.springframework.org/schema/aop"
    	     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	     xmlns:tx="http://www.springframework.org/schema/tx"
    	     xsi:schemaLocation="http://www.springframework.org/schema/beans 
    	     	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
             
               http://www.springframework.org/schema/context 
               http://www.springframework.org/schema/context/spring-context-2.5.xsd
               
                http://www.springframework.org/schema/aop 
               http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
    			">
    			<!-- 在spring-context.jar的meta-inf//spring-context.jar中确定xsd是哪个版本 -->
    	
    	<!-- <context:annotation-config></context:annotation-config> -->
    	<context:component-scan base-package="proxy.spring.agent.*"></context:component-scan>
    
    	<bean id="myAgent" class="proxy.spring.agent.AgentProxy"></bean>
    	<bean id="singer" class="proxy.spring.agent.MySinger"></bean>
    
    	<aop:config>
    		<aop:pointcut expression="execution(* proxy.spring.agent.MySinger.*(..))" id="point1"/>
    		<aop:aspect id="aspect1" ref="myAgent">
    			
    			<aop:before method="before" pointcut-ref="point1"/>
    			<aop:after method="after"   pointcut-ref="point1" />
    			<aop:after-returning method="afterReturn"  pointcut-ref="point1"/>
    			<aop:after-throwing method="afterThrow"   pointcut-ref="point1"/>
    			<aop:around method="around"  pointcut-ref="point1"/>
    		</aop:aspect>
    	</aop:config>
    
    </beans>


    ---------------------------------------------------代理类proxy.spring.agent.AgentProxy-----------------(歌手的经纪人,管着歌手的吃饭拉。。)------------------------------

    package proxy.spring.agent;
    
    import javax.sound.midi.SysexMessage;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    
    public class AgentProxy {
    	
    	public void before(){
    		System.out.println("before()........");
    	}
    	
    	public void after(){
    		System.out.println("after()......");
    	}
    	
    	public void afterThrow(){
    		
    		System.out.println("after()......");
    	}
    	
    	
    	public void around(ProceedingJoinPoint p){
    		//得到参数
    		Object[] o= p.getArgs();
    		for (int i = 0; i < o.length; i++) {
    			Object object = o[i];
    			System.out.println(object);
    		}
    		
    		try {
    			//必须加,不加就不执行原函数
    			p.proceed();
    		} catch (Throwable e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		System.out.println("around()....");
    	}
    	
    	public void afterReturn(){
    		
    		System.out.println("afterReturn()......");
    	}
    }
    


    ----------------------------------------------被代理类proxy.spring.agent.MySinger-----------------(著名的歌手)--------------------

    package proxy.spring.agent;
    
    public class MySinger {
    
    	public void sing(){
    		System.out.println("我唱歌");
    	}
    	
    	public String ss(String name){
    		System.out.println("MySinger"+"...."+name);
    		return name;
    	}
    }
    


    --------------------------------测试--------main------------------

    package proxy.spring.agent;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test {
    	
    	public static void main(String[] args) {
    		ApplicationContext app =
    			new ClassPathXmlApplicationContext("proxy/spring/agent/application.xml");
    		 
    		MySinger singer =(MySinger)app.getBean("singer");
    		
    		singer.sing();
    		
    		System.out.println("main"+"...."+ singer.ss("周杰伦"));
    	}
    		
    }
    


    --------------------结果-------------------

    before()........
    我唱歌
    after()......
    afterReturn()......
    around()....
    before()........
    周杰伦
    MySinger....周杰伦
    after()......
    afterReturn()......
    around()....
    main....null
    -----------------------------------------------------------下篇文章用注解

  • 相关阅读:
    Linux内核基础--事件通知链(notifier chain)good【转】
    10 个迅速提升你 Git 水平的提示【转】
    notifier chain — 内核通知链【转】
    内核通知链 学习笔记 【转】
    Linux内核基础--事件通知链(notifier chain)【转】
    Git 使用规范流程【转】
    Linux中断(interrupt)子系统之二:arch相关的硬件封装层【转】
    学习 Linux,101: 自定义或编写简单脚本【转】
    MySQL数据处理函数
    Effective JavaScript Item 36 实例状态仅仅保存在实例对象上
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2987453.html
Copyright © 2020-2023  润新知