接下来会分几次透彻的介绍面向切面编程
MethodInterCeptor(方法拦截器)
//实现MethodInterceptor接口,并且spring管理当前类
@Component("controllerMethodInterceptor1")
public class ControllerMethodInterceptor implements MethodInterceptor{
//重写invoke方法,methodin为拦截的方法,其中包含该方法的各种参数
@Override
public Object invoke(MethodInvocation methodin) throws Throwable {
System.out.println("拦截器开始");
//执行方法获取结果
Object result = methodin.proceed();
System.out.println("拦截器结束");
return result;
}
}
然后把拦截类放入BeanNameAutoProxyCreator(此类是对方法拦截器的管理)
@Component
//继承BeanNameAutoProxyCreator,实现InitializingBean是为了在spring初始化这个类的时候,会执行父类setBeanNames和setInterceptorNames把切哪里和执行哪个拦截器带入BeanNameAutoProxyCreator类
public class AllMethodInterceptor extends BeanNameAutoProxyCreator implements InitializingBean{
private static final long serialVersionUID = 1L;
@Override
public void afterPropertiesSet() throws Exception {
super.setBeanNames(new String[]{"*Service"});//切任何结尾为Service类的方法
super.setInterceptorNames(new String[]{"controllerMethodInterceptor1"});
//执行beanId为controllerMethodInterceptor1的拦截器
}
}
或者另一种方式把BeanNameAutoProxyCreator配置在XML中
<bean id="serviceInteceptorProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="interceptorNames"> <list> <!-- 放入拦截器类的BeanID --> <value>controllerMethodInterceptor1</value> </list> </property> <property name="beanNames"> <!-- 定义拦截范围 --> <value>*Service</value> </property> </bean>
转载于:https://blog.51cto.com/13064904/1979554