spring的aop(面向切面编程)思想总结就是八个字“纵向重复,横向抽取”。其思想在很多方面都有体现,例如在Filter中设置字符的编码格式,Intercepter中赋值参数进行登录校验等等。以下图示展示了aop思想的一个重要且常见的用途,我们知道在service的实现层中每次数据操作都要开启事务和关闭事务,这样做相当的麻烦, 运用代理技术生成能够自动开启和自动关闭事务的service代理对象可以解决这个问题,spring aop是通过代理对象实现运行时织入的,这一过程可以通过xml配置或者注解的方式实现(这里不做讨论)。通常的代理技术有动态代理和cglib代理,下面就对我所了解的原生的代理技术进行描述。
一:动态代理
1.编写service和service的实现类
2.构建生成代理对象的工厂类
3.测试
4.测试结果
二:cglib代理
动态代理的缺陷是所代理的对象必须要实现接口,如果没有接口怎么办,这时可以用cglib代理技术。cglib代理属于第三方代理,要导入额外的jar包,因为cglib代理是基于继承,所以代理对象不能被final修饰。
1.编写service和service的实现类
2.构建生成代理对象的工厂类
3.测试
4.测试结果
由以上的运行结果可知:动态代理,必须要有接口,cglib代理(继承代理对象),类不能被final修饰,cglib因为是继承自代理对象,所以和代理对象类型是一样的,动态代理和代理对象压根就是不相关的,所以和代理对象的类型是不一样的