Spring Aop到底有什么用处?
2017-05-15 21:40
330 查看
假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如
但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。
但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。
通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置插入这些功能。这样的思想,被称为面向切面编程,亦即AOP。
为了在指定位置执行这些横向的功能,需要知道指定的是什么地方
例如上图,方法级别的aop实现,在一个程序执行链条中,把method2称为切点,也就是说在method2执行时会执行横切的功能,那么是在method2之前还是之后呢,又是执行什么呢?这些都由advice(通知)来指定。advice有5种类型,分别是
把切点和通知合在一起就是切面了,一个切面指定了在何时何地执行何种方法。在spring aop中如此定义这个切面:
使用注解@Aspect将某个特定的类声明为切面,这样,该类下的方法就可以声明为横向的功能点后插入到指定位置。使用execution表达式声明在这个切点,格式如下
第一个位置指定了方法的返回值,*号代表任意类型的返回值,然后是所在的类和方法名,*号同样代表任意,就是该类中任意的方法,在上一个例子中方法名是login,则是指定了该类中的lo
abca
gin方法。然后最后一个参数是方法入参,因为Java中支持重载,所以这个参数可以帮助你更精确的进行定位。两点表示任意参数类型。这样,execution表达式告诉了程序该在何地执行通知。而被诸如@Before注解修饰的方法就是通知的内容,也就是做什么。
至此,我们就可以使用spring aop,但是还有两点需要得到注意
将切面类声明为一个bean
切点指定的方法所在的类也同样需由spring注入才能生效
但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。
但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。
通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置插入这些功能。这样的思想,被称为面向切面编程,亦即AOP。
为了在指定位置执行这些横向的功能,需要知道指定的是什么地方
例如上图,方法级别的aop实现,在一个程序执行链条中,把method2称为切点,也就是说在method2执行时会执行横切的功能,那么是在method2之前还是之后呢,又是执行什么呢?这些都由advice(通知)来指定。advice有5种类型,分别是
通知类型 | 简介 |
---|---|
Before(前置通知) | 目标方法调用之前执行 |
After(后置通知) | 目标方法调用之后执行 |
After-returning(返回通知) | 目标方法执行成功后执行 |
After-throwing(异常通知) | 目标方法抛出异常后执行 |
Around(环绕通知) | 相当于合并了前置和后置 |
@Aspect @Component public class UserAspect { @Before("execution(* com.aop.service.impl.UserServiceImpl.login(..))") public void loginLog(){ System.out.println("user login"); } }
使用注解@Aspect将某个特定的类声明为切面,这样,该类下的方法就可以声明为横向的功能点后插入到指定位置。使用execution表达式声明在这个切点,格式如下
第一个位置指定了方法的返回值,*号代表任意类型的返回值,然后是所在的类和方法名,*号同样代表任意,就是该类中任意的方法,在上一个例子中方法名是login,则是指定了该类中的lo
abca
gin方法。然后最后一个参数是方法入参,因为Java中支持重载,所以这个参数可以帮助你更精确的进行定位。两点表示任意参数类型。这样,execution表达式告诉了程序该在何地执行通知。而被诸如@Before注解修饰的方法就是通知的内容,也就是做什么。
至此,我们就可以使用spring aop,但是还有两点需要得到注意
将切面类声明为一个bean
切点指定的方法所在的类也同样需由spring注入才能生效
相关文章推荐
- Spring Aop到底有什么用处?
- 因子分析到底有什么用处?
- spring 的优点?什么是DI机制? 什么是AOP?
- spring.net 到底有什么好处?我还是没找到它好处?
- spring里面的bean到底是什么鬼
- struts+spring+hibernate(SSH)框架中spring到底起什么作用啊?它与struts+hibernate(SH)框架相比又有哪些优缺
- spring到底是什么!新手必看
- spring在ssh框架中到底起到什么作用
- spring在ssh框架中到底起到什么作用
- spring在ssh框架中到底起到什么作用
- 什么是spring.net的 核心DI容器、AOP、Web框架
- Spring学习笔记 什么是AOP
- 两种Spring事务管理方式:编程式、声明式 跟spring aop管理事务有什么不同?
- JDK动态代理干了什么事情?为什么我的事务会不起效?spring的事务到底应该怎么使用?原理是什么?
- Spring的AOP(一):什么是AOP
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- Spring AOP两种实现机制是什么?
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 什么是spring,spring的优缺点,AOP和IOC的理解,spring的动态代理
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。