接下来会分几次透彻的介绍面向切面编程

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>