切面編程(1)

接下來會分幾次透徹的介紹面向切面編程

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>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章