java 动态代理配合注解实现注入

感谢:

http://sweets.cf/2015/12/09/%E4%BD%BF%E7%94%A8Java%E5%8E%9F%E7%94%9F%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E6%B3%A8%E5%85%A5/

 

一、在上次的基础上进行拓展

java 动态代理实现aop

二、如何实现注入

1.先写出一个注解

testannotation.java

既然要通过注解进行注入,那么第一步当然需要创建一个新的注解类。

比较需要注意的是元注解属性的选择。

2.注释需要注解的类属性

xie.java

有了注解,当然要使用。修饰相应的属性即可。

3.写出一个注入类,包装要执行的类,负责进行参数的注入

aopinjection.java

我个人理解:这里的所谓注入类,就是一个包装类。在这个包装类中,获取被注解的属性(字段/方法),如果字段被注解,那么通过反射调用set方法进行字段的赋值。如果方法被注解,根据注解中的属性做对应的操作,然后反射调用。

4.代理执行这个注入类

把代理执行的对象更改一下:

改为:

把之前的代理类换成包装之后的代理类。

5.写一个main方法,执行

main.java

为了更好地看运行中的方法,在aophandler.java处加一行输出:

运行结果:

到此为止,可以发现正确进行了参数注入。

三、有个想的不是很明白的地方

写完这个demo以后,我发现写成这样也可以执行参数注入,但是没了aop的功能:

testMain.java

其实就是跳过了动态代理的步骤,所以没有aop的过程了。

运行结果如下:

问题一:既然这样也可以实现参数注入,那么为什么要使用动态代理的方式呢?

问题二:后来又一想,因为动态代理类中也可以使用反射,那么为什么还要写个包装类,然后才代理,为何不直接在动态代理类中进行处理呢?

我个人认为,问题一还是可以理解的,毕竟不使用动态代理,就不能实现aop了,拓展性不好。但是问题二我就没想明白了,感觉自己可能写复杂了。

四、总结

总体来说还是把过程搞明白了。本质上是反射、注解、动态代理的结合使用,只要能明白基础原理,这种需求并不会难以实现。

发表评论

电子邮件地址不会被公开。 必填项已用*标注