博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 自定义注解(上)
阅读量:5739 次
发布时间:2019-06-18

本文共 3049 字,大约阅读时间需要 10 分钟。

首先定义一个简单的Service:

public interface IDemoService {    void add(int a, int b);}@Servicepublic 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)@Documentedpublic @interface Log {}复制代码

使用BeanPostProcesser来生成自定义的代理对象:

@Servicepublic 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 结束执行
源代码地址:
解决了如果有一个方法加了@Log注解,那么这个类所有的方法都会执行Log的情况。
至于原理嘛。。下篇讲述。。
《Java并发编程系统》是一本系统介绍Java并发编程方面的书籍。囊括了从最基本的并发原理到顶层API的使用,以及到最后的深入实践。适合零基础想深入学习Java并发编程的人员,本书包含了Java并发的基本原理,并发包的使用等。

阅读地址:

转载地址:http://wvfzx.baihongyu.com/

你可能感兴趣的文章
ZJU PAT 1023
查看>>
WMI远程访问问题解决方法
查看>>
从零开始学习IOS,(UILabel控件)详细使用和特殊效果
查看>>
Android开发历程_15(AppWidget的使用)
查看>>
阿花宝宝 Java 笔记 之 初识java
查看>>
7、设计模式-创建型模式-建造者模式
查看>>
Cesium官方教程11--建模人员必读
查看>>
我国古代的勾股定理
查看>>
Linux下的C编程实战
查看>>
[32期] html中部分代码与英语单词关系
查看>>
PHP安装环境,服务器不支持curl_exec的解决办法
查看>>
9.1(java学习笔记)正则表达式
查看>>
fopen打开文件失败的问题
查看>>
jQuery|元素遍历
查看>>
sql语句大全
查看>>
RedHat 6 安装配置Apache 2.2
查看>>
Openstack 安装部署指南翻译系列 之 Manila服务安装(Share Storage)
查看>>
underscore.js学习笔记
查看>>
Centos7安装
查看>>
windows下常用命令
查看>>