什么是代理类?
代理就是代替我们去执行一些额外的工作。
目标类:只有核心功能的类
比如我们在写service的时候,调用dao方法是我们的核心业务,而service类中的日志记录,事务处理,异常处理等都属于额外的功能,每个service方法中都要写一次这些额外功能也会造成大量代码的冗余,
而面向切面编程的意思就是说把这些公共的、额外的代码功能抽取出来,每个service里面只写我们的核心业务,这样就提高了我们的开发效率。
为什么代理类和目标类要实现相同的接口?
1.从代码的角度来说,代理类对象能够赋值给接口类型的变量
2.要保证代理类和目标类有相同的功能
有了代理类:
程序员可以只关心核心功能
额外功能+目标类 =代理类
以上这种说法就是叫做静态代理,
静态代理就是在代码编译时,代理类已经存在
好处:程序员可以只关心核心功能
不好:多个代理类 , 没有解决代码冗余的问题
什么是动态代理?
运行时,动态创建出来代理对象
SpringAOP通过动态代理,让程序猿只关心核心代码,同时代码不再冗余
springAOP的开发步骤:
1.写核心功能(目标类)
核心功能就是调用dao方法:
2.配置目标类
要在SpringApplication.xml文件中配置目标类所在路径
<!--配置目标类--> <bean id="bookService" class="com.macw.serviceImpl.bookServiceImpl"> <property name="bookDao" ref="bookDao"></property> </bean>
3.写额外功能(增强处理)
(公共功能:日志处理/事务处理/异常处理/性能分析…) 等
前置增强(MethodBeforeAdvice):在核心功能之前执行的额外功能
后置增强:在核心功能之后执行的额外功能
环绕增强:在核心功能之前以及之后执行的额外功能
异常增强:在核心功能发生异常时执行的额外功能
前置增强的配置使用:
1,声明一个类,需要实现 MethodBeforeAdvice接口:
2,spring配置文件中,配置声明的增强功能类
<!--额外功能--> <bean id="myBeforeAdvice" class="com.macw.advice.myBeforeAdvice"></bean>
3,在spring配置文件中,通过aop标签做配置(需要添加aop命名空间以及schema验证文档):
.在哪些方法上面做增强处理
.在需要增强处理的方法上面,加哪个增强处理
4.让spring在运行的时候,帮我们创建代理对象()
详解advice
MethodBeforeAdvice前置增强的before方法
实现MethodBeforeAdvice接口必须要要实现before方法,这个方法有三个参数,
arg0:目标方法,
arg1:目标方法参数,
arg2:目标类,
2.AfterReturningAdvice:后置增强
3.ThrowsAdvice:异常增强
4.MethodInterceptor:环绕增强,目标方法执行之前以及之后做的增强处理
总结:
Spring AOP:Aspect Oriented Program 面向切面编程
几个重要概念:
1.切入点:需要把增强处理加在的位置;service层的方法上面;需要在配置文件中配置
2.增强处理:额外功能(公共功能) ,通知/建议(advice)
3.目标类:核心功能所在的类(原始类)
4.切面:把增强处理,放在切入点的位置,形成的一个概念
5.编织/织入:把增强处理放置在切入点的过程
AOP使用场景:
1.把功能内容抽取出来,形成advice;在配置文件中中做配置====>程序猿只关心核心功能;解决冗余
2.在原有功能基础之上,做功能扩展===>在不改变原有代码的基础上做功能扩展
AOP实现:代理模式的使用
代理类的产生原理
类加载ClassLoader
代理类的生成:由jdk动态代理生成
SpringAOP实现原理:
1.底层通过字节码技术,把目标对象以及额外功能动态封装,生成代理对象 ==>动态代理
使用了JDK动态代理以及cglib动态代理
2.为什么通过id得到的是代理对象
spring工厂创建对象之后,由BeanPostProcessor进行处理