`
wh8766
  • 浏览: 34885 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 03 (AOP 拦截器)

阅读更多
1.AOP
面向方面编程

OOP:
面向对象编程

OOP:主要是关于对象怎么封装的问题
AOP:为程序的某个切面进行的通用处理


2.spring中两大核心概念:
IOC:依赖注入
AOP:对程序的切面作统一的处理


3.使用AOP的”前通知“
A.面向接口
B.定义通知类
C.在配置文件中注入相关节点

4.拦截器
<bean id="doNow" class="windy.demo.DoNow"></bean>
<bean id="dobefore" class="windy.demo.DoAdvice"></bean>

<bean id="doAdvice" class="org.springframework.aop.framework.ProxyFactoryBean">
	<property name="proxyInterfaces">
		<value>windy.demo.Ido</value>
	</property>
	<property name="target">
		<ref bean="doNow"/>
	</property>
	<property name="interceptorNames">
		<value>dobefore</value>
	</property>
</bean>


先写一个拦截器
实现了org.springframework.aop.MethodBeforeAdvice接口
在before方法里做拦截后的逻辑处理

通过ProxyFactoryBean这个类来进行拦截控制
当得到的loginAdvice中的login对象方法每调用一次,都会使用拦截器loginbefore的方法
interceptorNames是绑定的拦截器的名字(要求是String类型的,这里用value标签)
proxyInterfaces是以某种接口来返回 这里是Ido
target是需要拦截器的对象,被管理的对象

同样的,也可以使用ProxyFactoryBean来进行异常处理等事项
这里也需要一个Advice
实现org.springframework.aop.ThrowsAdvice类
里面的方法可以为
public void afterThrowing(ArithmeticException e);
public void afterThrowing(Method method,Object[] args,Object target,NullPointerException e);

从Spring API中可以看到
There aren't any methods on this interface, as methods are invoked by reflection. Implementing classes should implement methods of the form:
afterThrowing([Method], [args], [target], Throwable subclass)
只有最后一个参数是必须的

5.返回通知AfterReturningAdvice
实现org.springframework.aop.AfterReturningAdvice
此接口中需要实现的方法如下:
public void afterReturning(Object returnvalue, Method m, Object[] arg2,
			Object target) throws Throwable {
	System.out.println(target.getClass().getName()+"类中"+m.getName()+"方法被调用,其返回值为:"+returnvalue);
	}


6.批量拦截类NameMatchMethodPointcutAdvisor
虽然拦截器实现MethodBeforeAdvice,但是在配置的时候可以这么配置:
<bean id="userBefore" class="com.sun.demo.UserDaoBeforeAdvice"></bean>
<bean id="log" class="com.sun.demo.Log"></bean>

<bean id="named" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice">
<ref bean="userBefore"/>
</property>
<property name="mappedNames">
<list>
<value>del*</value>
</list>
</property>
</bean>
这里的list就是需要匹配拦截的字符串 比如所有以del开头的方法都会被拦截器抓到

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics