面向切面的Spring(二) xml中定义aop

Spring的AOP配置元素

 

Spring的AOP配置元素
AOP配置元素 用途
定义AOP通知器
定义AOP后置通知
返回通知
异常通知
环绕通知
定义切面
启用注解@AspectJ定义的切面
前置通知
最顶层的AOP元素,其他必须包含在这个标签内部
为定义的对象引入接口
定义切点

*切面类,和前面JavaConfig配置不同,将切点定义在xml中

public class Audience {
	public void performance(){}
	public void silencePhones(){
		System.out.println("silence cell phones .... ");
	}
	public void takeState(){
		System.out.println("take state  .... ");
	}
	public void appluase(){
		System.out.println("clap clap clap! ..");
	}
	public void round(ProceedingJoinPoint jp){
		try {
			System.out.println("silence cell phones .... ");
			System.out.println("take state  .... ");
			jp.proceed();
			System.out.println("clap clap clap! ..");
		} catch (Throwable e) {
			e.printStackTrace();
		}
	}
}

* 创建Aspect-xml.xm

 
   
   
   
   
   
   
   
   	
   		
   		
   	
   

* Junit测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value="classpath:aspectJ-xml.xml")
public class CDPlayerTest {
	@Autowired
	private UserService us;
	@Test
	public void test(){
		us.sayAdd();
	}
}

注意到环绕通知,在aop:around元素的method属性里写的也是方法名

* xml中如何为通知传递参数

1. 定义切面类

public class TrackCounter {
	private Map trackCounts = new HashMap();
	public void countTrack(int i){
		int currentCount = getPlayCount(i);
		trackCounts.put(i, currentCount+1);
	}
	public int getPlayCount(int count){
		return trackCounts.containsKey(count)?trackCounts.get(count):0;
	}
}

2. 定义连接点

public interface CompactDisc {
	void play();
	void playTrack(int i);
}

每调用一次playTrack方法,将方法里面的参数传递到通知中,并记录

3. xml

 
   
   
   
   		
   		
   
   
	   	
   	
   	
		   	
   	
   

需要注意的是,AspectJ指示器和前面在JavaConfig中不用的是,&&换成了 and  其他的一致。

* 在xml中向对象引入新的接口

其实就是在定义的对象层次,定义它的父类型。在本例中对UserService的子类增加父类型接口Encoreable。

前面一节,使用@Declareparents实现的。这里xml中配置如下


	
   
   	
   	
   		
   	
   

属性说明:

* types-matching: 需要引入接口的类

* implement-interface:引入的接口

* delegate-ref:引入的接口默认实现类的Bean

* delegate-impl:引入的接口默认实现类

你可能感兴趣的:(Spring)