学习笔记: AOP面向切面编程理解

AOP => Aspect Oriented Programming 面向切面编程

通过预编译方式和运行期代理实现程序功能同一维护的技术,AOP是OOP的延续

采用横向抽取,取代传统纵向继承体系
可以进项性能监视,事务管理,安全检查,缓存的操作


DAO=> data access object
数据访操作


如果想对功能进行检查扩展

public class UserDAOImpl implements UserDAO{
	public void save(User user){
		//保存用户
		}
	public void update(User user){
		//更新用户
		}
	public void find(User user){
		//查询用户
		}
	}

传统方法,先写父类方法,由子类继承

public class BaseDAOImpl{
	public void checkPrivilege(){}
}

public class UserDAOImpl extends BaseDAOImpl{
	public void save(User user){
		checkPrivilege()
	//
	}
	...
}

AOP的方法采用横向抽取机制 (代理)

public class UserDAOImpl implements UserDAO{
	public void save(User user){
		//保存用户
		}

对接口生成代理
UserDAOImpl => Proxy

AOP使用纯java实现,不需要专门的编译过程和类加载器,运行期通过代理方式向目标类植入增强代码


相关术语

  • Joinpoint(连接点): 哪些点可以被拦截=> 在spring中为方法
  • Pointcut(切入点): 将要对哪些Joinpoint进行拦截
  • Advice(增强): 拦截到Joinpoint后的操作(前置,后置,环绕,异常,最终)
  • Introduction(引介):是一种特殊的通知,在不修改代码的情况下,在运行期间动态添加方法
  • Target(目标对象): 代理的目标对象
  • Weaving(织入): 把增强应用到目标来创建代理对象的过程(spring采用动态代理)
  • Proxy(代理): 一个类被增强后产生的结果类
  • Aspect(切面): 是切入点和通知(引介)的结合


底层实现原理

  1. JDK动态代理 (通过接口生成代理)
  2. CGLIB动态代理 (通过子类生成代理)

程序中应优先对接口创建代理,便于程序解耦
标记为final的方法,不能被代理,因为无法被覆盖
spring只支持方法连接点,不提供属性连接点


Spring AOP增强类型

AOP联盟为advice定义了org.aopalliance.aop.Interface.Advice

Spring 按照通知在目标类方法的连接点位置,设置5种

  • 前置通知 org.springframework.aop.MethodBeforeAdvice
    在目标方法执行前实施增强
  • 后置通知 org.springframework.aop.AfterReturningAdvice
    在目标方法执行后实施增强
  • 环绕通知 org.springframework.aop.MethodInterceptor
    在目标执行前后
  • 异常通知 org.springframework.aop.ThrowsAdvice
    在方法跑出异常后实施增强
  • 引介通知

Spring AOP切面

advisor: 代表切面
PointcutAdvisor: 代表具有切点的切面,可以指定拦截目标类哪些方法
IntroductionAdvisor: 代表引介切面,针对引介通知而使用切面

不需要写传统增强
设置配置即可

配置:基本spring包+ aop联盟包 + springAOP

你可能感兴趣的:(java,学习笔记,java,spring,aop)