首页 > 代码库 > JavaEE--Spring_AOP
JavaEE--Spring_AOP
一、AOP概念
1、aop:面向切面编程,扩展功能不用修改源代码实现
2、AOP采取横向抽取机制,取代了传统的纵向继承体系重复代码
3、AOP底层采用动态代理实现
(1)有接口的情况,用动态代理创建接口实现类的代理对象
(2)没有接口的情况,用动态代理创建子类的代理对象
扩展功能的实现:
(1)public class User{
public void add(){
System.out.println("add-----");
System.out.println("添加日志");//通过修改源代码扩展功能
}
}
(2)纵向抽取机制解决
public class BaseUser{
public void writeLog(){
System.out.println("添加日志");
}
}
public class User extends BaseUser{
public void add(){
System.out.println("add-----");
//调用父类方法实现日志扩展功能
super.writeLog();
}
}
(3)动态代理解决
有接口:使用jdk动态代理
无接口:使用cglib动态代理
二、配置文件实现AOP操作
1、aop的常用术语
连接点:类中的那些方法可以被增强,这些方法称为连接点
切入点:实际被增强的方法
增强/通知:增强的逻辑被称为增强,比如日志扩展功能,这个日志功能就称为增强
前置通知:在方法之前执行
后置通知:在方法之后执行
异常通知:方法出现异常
最终通知:在后置之后执行
环绕通知:在方法之前和方法之后执行
切面:把增强引入到具体方法上,这个过程称为切面
2、AspectJ简介
AspectJ是一个面向切面的框架,它本身不属于Spring的一部分,Spring2.0以后新增了对它的支持
3、使用表达式配置切入点
execution(<方法修饰符>?<返回类型><方法名>(<参数>) <异常>)
execution(* com.spring.aop.User.add(..))
execution(* save*(..))匹配所有save开头的方法
4、具体配置
<bean id="user" class=="全路径"></bean>
<bean id="myuser" class=="全路径"></bean>
aop配置
<aop:config>
配置切入点
<aop:pointcut expression="execution(* com.spring.aop.User.add(..))" id="pointcut01"/>
配置切面
<aop:aspect ref="myuser">
配置前置增强
<aop:before method="增强类的方法名" pointcut-ref="pointcut01"/>
</aop:aspect>
</aop:config>
5、环绕通知增强类的代码
public class myuser{
public void writeLog(ProceedingJoinPoint joinPoint){
System.out.println("方法之前");
joinPoint.proceed();//执行被增强方法
System.out.println("方法之后");
}
}
三、注解方式实现AOP操作
1、创建对象
<bean id="user" class=="全路径"></bean>
<bean id="myuser" class=="全路径"></bean>
2、开启AOP操作
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
3、具体实现
@Aspect
public class MyUser{
@Before(value="http://www.mamicode.com/execution(* User全路径.add(..))")
public void before(){}//增强方法
}
public class User{
public void add(){}//被增强方法
}
JavaEE--Spring_AOP