一、简述--是什么
1、spring 使用jdk动态代理或cglib动态代理,没错是或。
2、 Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。默认的策略是如果目标类是接口,则使用JDK动态代理技术,否则使用Cglib来生成代理。当然,可以通过配置指定代理方式。<aop:aspectj-autoproxy></aop:aspectj-autoproxy>有个属性,proxy-target-class 默认是false,这个时候就是JDK动态代理,如果true则是CGLIB动态代理。但是,如果当目标类,没有接口的情况下,即使是配了false,也会是是cglib动态代理。
二、使用场景AOP使用场景--什么时候用
AOP具体可以在下面的场景中使用:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
三、使用spring aop 使用--怎么用
使用方式大体上分为两类,一类是通过xml配置文件的方式,另一种是编码的方式。
1、xml配置的方式大致分为:四种方式:
(1)配置ProxyFactoryBean,显式地设置advisors, advice, target等
(2) 配置AutoProxyCreator,这种方式下,还是如以前一样使用定义的bean,但是从容器中获得的其实已经是代理对象
(3) 通过<aop:config>来配置
(4) 通过<aop: aspectj-autoproxy>来配置,使用AspectJ的注解来标识通知及切入点
2、使用ProxyFactory来以编程的方式使用Spring AOP,通过ProxyFactory提供的方法可以设置target对象, advisor等相关配置,最终通过 getProxy()方法来获取代理对象。
这种编码的方式还是会破坏代码的业务逻辑的,不推荐。
下面主要介绍xml配置方式中通过<aop: aspectj-autoproxy>来配置,使用AspectJ的注解来标识通知及切入点。
第一步:
spring-aop.xml
注意文件中带有aop的几个命名空间。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
<!--为匹配@aspect切面的类创建代理,并织入增强和横切逻辑-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
第二步:
创建切面 LogAspectJ。
切面包括切点、增强和横切逻辑
package com.aop.springAop;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
/**
* Created by weiyuan on 2018/7/16/016.
*/
@Aspect
@Component
public class LogAspectJ {
@Before("execution(* goTo(..))")
public void logPrint() {
System.out.println("我是横切逻辑。。。。");
}
}
第三步:测试类 ClientTest
package com.controller;
import com.aop.springAop.SampleBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ClientTest {
@RequestMapping("/goto")
public void goTo(){
System.out.println("hello,goto...");
}
}
测试结果: