这篇是我跟着动力节点蓉姐学spring的时候做的笔记,如有不足求大佬勿喷
一、什么是AOP:
AOP面向切面编程,抽象的专业定义这里我就不讲了我用下面的图具象的讲解一下:
如果把下面每个椭圆都看成一个业务,它是由很多部分组成的,总结来说可以分为两个部分:非业务代码(日志操作,资源释放,事务管理等)和主业务代码。我们用一把刀把椭圆切开让主业务和非业务切开,切开的那个切口就是切面,切开口两部分分开来写,最后把切口对接上,形成完整业务,实现解耦合。
从代码上来讲就是把与主业务无关的高度复用的代码(日志信息,事务管理等)抽象出来,让业务与这些非业务代码分开来写,实现解耦合,最后通过绑定的方式生成一个代理对象,这个代理对象整合了业务逻辑与非业务逻辑共系统直接使用。
二、aspectj框架:
spring中的一个AOP框架,使用spring开发时我们一般不用spring原生方式实现AOP,而是使用aspectj框架更高效和便捷。在pom中添加坐标即可使用
三、开发步骤:
- 编写业务类:按照正常的面向接口编程,先定义接口再写impl类实现
- 编写切面类:在类路径下新建包写切面类,在类生使用@Aspect注解标注这个类是切面类,类中的方法通过注解(@Before ,@After,@AfterReturning,@Arround ,@Pointcut)标注切入的时间(是在主业务前通知还是主业务后通知还是环绕通知,最终通知,定义切入点),注解的参数是固定格式详情见图
- 在spring的配置文件中创建并绑定业务对象和切面对象:使用<aop:aspectj-autoproxy></aop:aspectj-autoproxy>标签一键绑定
- 通过getBean(“业务对象”);直接获得代理对象使用
四、通过改变切入点表达式来改变切面对象切入的范围
五、使用cjlib子类代理
aspectJ默认是jdk动态代理,jdk动态代理返回的代理对象只能用接口类型来接收(接口实现类接收由于范围太小接不住代理类类型),如果我们想切换cglib动态代理用子类(接口实现类)来接住代理对象那么就要在spring的配置文件中的aop里手动切换:添加proxy-target-class=”true”属性
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
六、使用注解
如果不想在spring配置文件中注册切面类了,我们可以通过在切面类上加@Component注解来注册,使用这种方法别忘了在配置文件中加入组件扫描器