AOP面向切面编程
2017-08-22 19:16
155 查看
spring的三大核心:控制反转、依赖注入、面向切面编程。
控制反转:对象A依赖对象B,如果收到把对象B给new出来,会使代码高度耦合,产生硬编码。为了避免这种情况,通过注解或配置XML将bean托管给spring管理。由spring进行bean实例的创建
依赖注入:当spring把对象B创建出来后,需要设置到对象A中,这一过程称为依赖注入
面向切面编程:什么是面向切面编程?在运行时,动态地将代码织入到指定类的指定方法、指定位置上的编程思想就是面向切面的编程。一般而言,我们管织入到指定类指定方法的代码片段称为切面,而织入到哪些类、哪些方法则叫切入点。对于面向切面编程这里举个实例:在dao层对数据库操作时,都使用到了事务,在对数据库操作时都可能抛出异常,当抛出异常时都要做回滚操作。为避免在dao层对数据库操作时都要捕获异常做回滚,创建一个切面实现做回滚操作功能,然后指定切点,当发生异常时实现切面功能。对于切面代码块什么时候的调用,这里有做一些下列举:
当使用面向切面进行编程时,需要做XML文件配置声明哪些类是切面,哪些方法是切点,或者需要添加注解来做声明。做XML配置不再举例,这里以注解方式来说明一下面向切面的编程
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class SleepHelper {
public SleepHelper(){
}
@Pointcut("execution(* *.sleep())")(切点)
public void sleeppoint(){}
@Before("sleeppoint()")
public void beforeSleep(){
System.out.println("睡觉前要脱衣服!");
}
@AfterReturning("sleeppoint()")
public void afterSleep(){
System.out.println("睡醒了要穿衣服!");
}
}
用@Aspect的注解来标识切面,注意不要把它漏了,否则Spring创建代理的时候会找不到它,@Pointcut注解指定了切点,@Before和@AfterReturning指定了运行时的通知,注
意的是要在注解中传入切点的名称
控制反转:对象A依赖对象B,如果收到把对象B给new出来,会使代码高度耦合,产生硬编码。为了避免这种情况,通过注解或配置XML将bean托管给spring管理。由spring进行bean实例的创建
依赖注入:当spring把对象B创建出来后,需要设置到对象A中,这一过程称为依赖注入
面向切面编程:什么是面向切面编程?在运行时,动态地将代码织入到指定类的指定方法、指定位置上的编程思想就是面向切面的编程。一般而言,我们管织入到指定类指定方法的代码片段称为切面,而织入到哪些类、哪些方法则叫切入点。对于面向切面编程这里举个实例:在dao层对数据库操作时,都使用到了事务,在对数据库操作时都可能抛出异常,当抛出异常时都要做回滚操作。为避免在dao层对数据库操作时都要捕获异常做回滚,创建一个切面实现做回滚操作功能,然后指定切点,当发生异常时实现切面功能。对于切面代码块什么时候的调用,这里有做一些下列举:
AOP配置元素 | 描述 |
<aop:advisor> | 定义AOP通知器 |
<aop:config> | 顶层的AOP配置元素 |
<aop:pointcut> | 定义切点 |
<aop:aspect> | 定义切面 |
<aop:after-returning> | 定义AOP after-returning通知 |
<aop:after-throwing> | 定义after-throwing通知 |
<aop:after> | 定义AOP后置通知 |
<aop:before> | 定义AOP前置通知 |
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class SleepHelper {
public SleepHelper(){
}
@Pointcut("execution(* *.sleep())")(切点)
public void sleeppoint(){}
@Before("sleeppoint()")
public void beforeSleep(){
System.out.println("睡觉前要脱衣服!");
}
@AfterReturning("sleeppoint()")
public void afterSleep(){
System.out.println("睡醒了要穿衣服!");
}
}
用@Aspect的注解来标识切面,注意不要把它漏了,否则Spring创建代理的时候会找不到它,@Pointcut注解指定了切点,@Before和@AfterReturning指定了运行时的通知,注
意的是要在注解中传入切点的名称
相关文章推荐
- spring 面向切面编程AOP的原理
- 什么是面向切面编程AOP?
- AOP面向切面编程在Android中的使用
- PHP之AOP面向切面编程原理(3)
- AOP面向切面编程简介
- AOP(面向切面编程,翻译自MSDN)
- Aop 是面向切面编程,
- Spring AOP的基本原理及面向切面编程的实现
- 何为"面向切面编程AOP"
- Java乔晓松-基于注解的面向AOP(切面)编程
- Java乔晓松-基于注解的面向AOP(切面)编程
- AOP面向切面编程--高级
- AOP面向切面编程
- CGLIB实现AOP代理的测试类,与Spring分离,加深对面向切面编程的理解
- Guice 学习(八)AOP (面向切面的编程)
- 面向切面编程AOP 在iOS中的实现
- Java面试之面向切面编程AOP的原理,
- AOP面向切面编程
- 从壹开始前后端分离【 .NET Core2.0 Api + Vue 2.0 + AOP + 分布式】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
- SpringAOP入门-面向切面编程