首先定义一个简单的Service:
public interface IDemoService { void add(int a, int b); } @Service public class DemoServiceImpl implements IDemoService { @Log public void add(int a, int b) { System.out.println(Thread.currentThread().getName()); System.out.println(a + b); } }
假设@Log注解可以用来记录每个函数的执行情况:
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Log { }
使用BeanPostProcesser来生成自定义的代理对象:
@Service public class LogAnnotationBeanPostProcesser extends AbstractBeanFactoryAwareAdvisingPostProcessor { @Override public void setBeanFactory(BeanFactory beanFactory) { super.setBeanFactory(beanFactory); LogAnnotationAdvisor advisor = new LogAnnotationAdvisor(); advisor.setBeanFactory(beanFactory); this.advisor = advisor; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) { Method[] methods = ReflectionUtils.getAllDeclaredMethods(bean.getClass()); for (Method method : methods) { if (method.isAnnotationPresent(Log.class)) { ProxyFactory proxyFactory = prepareProxyFactory(bean, beanName); if (!proxyFactory.isProxyTargetClass()) { evaluateProxyInterfaces(bean.getClass(), proxyFactory); } proxyFactory.addAdvisor(this.advisor); customizeProxyFactory(proxyFactory); return proxyFactory.getProxy(getProxyClassLoader()); } } return bean; } }
LogAnnotationAdvisor用来处理切面:
public class LogAnnotationAdvisor implements BeanFactoryAware,Advisor{ private Advice advice; public LogAnnotationAdvisor(){ this.advice=new LogAnnotationInterceptor(); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { } @Override public Advice getAdvice() { return this.advice; } @Override public boolean isPerInstance() { // TODO Auto-generated method stub return false; } }
当然实例处理交给了:
public class LogAnnotationInterceptor implements MethodInterceptor, Ordered{ @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; } @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("开始执行"); invocation.proceed(); System.out.println("结束执行"); return null; } }
使用:
public class Main { public static void main(String[] args) { @SuppressWarnings("resource") ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml"); IDemoService demoService = context.getBean(IDemoService.class); // AsyncAnnotationBeanPostProcessor demoService.add(1, 2); } }
输出:
开始执行 main 3 结束执行
至于原理嘛。。下篇讲述。。
《Java并发编程系统》 是一本系统介绍Java并发编程方面的书籍。囊括了从最基本的并发原理到顶层API的使用,以及到最后的深入实践。适合零基础想深入学习Java并发编程的人员,本书包含了Java并发的基本原理,并发包的使用等。
阅读地址:
yuedu.baidu.com/ebook/d09e3…