[置顶] 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
-----------------------------------------------------------下篇文章用注解

 

posted @ 2013-03-28 20:13  javawebsoa  Views(329)  Comments(0Edit  收藏  举报