Java拦截技术快速上手

等有空的时候再加上讲解吧,先贴上代码。

1、拦截器Handle类:

package com.shansun.interceptor.test.handler;

import org.springframework.aop.TargetSource;
import org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import com.shansun.interceptor.test.core.InterceptorAdvisor;

/**
 * @author lanbo.xj
 */
public class InterceptorHandler extends AbstractAutoProxyCreator implements ApplicationContextAware {
	private static final long serialVersionUID = 8822145972561113575L;

	private static ApplicationContext applicationContext;

	public void setApplicationContext(ApplicationContext aApplicationcontext)
			throws BeansException {
		applicationContext = aApplicationcontext;
	}

	public static Object getBean(String beanName) {
		return applicationContext.getBean(beanName);
	}
	
	@Override
	protected Object[] getAdvicesAndAdvisorsForBean(@SuppressWarnings("rawtypes") Class beanClass, String beanName,
			TargetSource targetSource) throws BeansException {
		if(beanName.equals("springLoader")) return null;
		return new InterceptorAdvisor[] { new InterceptorAdvisor(beanName) };
	}
 
}

 2、拦截器:在每个方法前后打印一条信息

public class InterceptorAdvisor implements Advisor {
	Advice advice = null;
	
	public InterceptorAdvisor(String beanName) {
		advice = new InterceptorRoundAdvice(beanName);
	}
	
	public Advice getAdvice() {
		return advice;
	}

	public boolean isPerInstance() {
		return false;
	}
}

3、方法调用包裹类

public class InterceptorRoundAdvice implements MethodInterceptor, Advice {

	/**
	 * 被拦截的BEAN的名称
	 */
	private String beanName;

	public InterceptorRoundAdvice(String aBeanName) {
		this.beanName = aBeanName;
	}

	public Object invoke(MethodInvocation invocation) throws Throwable {
		String methodName = this.beanName + "."
				+ invocation.getMethod().getName();
		// 获取当前调用方法的参数
		Object[] arguments = invocation.getArguments();
		System.out.println("参数:" + getArguments(arguments));
		System.out.println(methodName + ": Before invocation!");
		Object result = invocation.proceed();
		System.out.println(methodName + ": After invocation!");
		return result;
	}
	
	private String getArguments (Object[] arguments) {
		StringBuilder sb = new StringBuilder();
		for(Object arg : arguments) {
			sb.append("Type:" + arg.getClass().getSimpleName() + "  Value:" + arg.toString());
		}
		return sb.toString();
	}

}

4、工程POM配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>InterceptorTest</groupId>
	<artifactId>InterceptorTest</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring</artifactId>
			<version>2.5.4</version>
		</dependency>
		<dependency>
			<groupId>aopalliance</groupId>
			<artifactId>aopalliance</artifactId>
			<version>1.0</version>
		</dependency>
		<dependency>
			<groupId>cglib</groupId>
			<artifactId>cglib</artifactId>
			<version>2.1_3</version>
		</dependency>
	</dependencies>
</project>

5、测试代码

public interface BusinessInterface {
	public void doSomething();
}
public class BusinessClass implements BusinessInterface {

	public void doSomething() {
		System.out.println("业务组件BusinessClass方法调用:doSomething()"); 
	}

}
public class SpringLoader implements ApplicationContextAware{
 
	private BusinessInterface businessInterface; 
	private ApplicationContext applicationContext; 
	 
	public void setBusinessInterface(BusinessInterface businessInterface) {
		this.businessInterface = businessInterface;
	}
	
	public void doSth() {
		if(businessInterface == null) {
			this.businessInterface = (BusinessInterface) applicationContext.getBean("businessInterface");
		}
		businessInterface.doSomething();
	}
 
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.applicationContext = applicationContext;
	} 
}
	public static void main(String[] args) {
		ApplicationContext ctx = new FileSystemXmlApplicationContext(
				"bean.xml ");
		SpringLoader sl = (SpringLoader) ctx.getBean("springLoader");
		sl.doSth();
	}

Spring配置文件:

<?xml version="1.0" encoding="GB2312"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="
                http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/util
                http://www.springframework.org/schema/util/spring-util.xsd"> 
	<bean id="businessInterface"
		class="com.shansun.interceptor.test.busi.impl.BusinessClass">
	</bean>
	<bean id="interceptorHandler"
		class="com.shansun.interceptor.test.handler.InterceptorHandler"> 
	</bean>
	<bean id="springLoader"
		class="com.shansun.interceptor.test.SpringLoader"> 
		
	</bean>
</beans>

测试结果:

参数:

businessInterface.doSomething: Before invocation!

业务组件BusinessClass方法调用:doSomething()

businessInterface.doSomething: After invocation!

 

你可能感兴趣的:(java,spring,AOP,maven,bean)