一、Spring的两大核心编程思想
-
IOC(Inversion of Control,控制反转)
获得依赖对象的过程由自身管理变为了通过容器进行DI(dependency injection,依赖注入)。
- A和B是两个类,当B中的方法需要使用A的对象时,叫做B依赖A - 常见的依赖关系:action(controller)依赖service、service依赖dao、service依赖其他service
-
AOP(Aspect Oriented Programming,面向切面的编程)
将额外功能(加在一系列操作中的冗余代码)都放到通知中,然后和切入点组成切面。
一个切面指的就是一个(动态)代理对象。
二、AOP(面向切面的编程)
动态代理
AOP底层封装的就是动态代理。
切面
切面:一个切面指的就是一个(动态)代理对象,切面由通知和切入点组成。
-
通知:除了目标方法以外的操作,比如事务通知、日志通知……
-
切入点:被加入通知的方法或类。
通知的分类
下图使用动态代理的代码说明通知的分类:
三、AOP编程步骤
-
引入依赖
spring-aop spring-expression spring-aspects
-
开发通知类(除了环绕通知,通知类中只需要写额外功能即可)
Spring提供的接口:
-
MethodBeforeAdvice 前置通知
-
AfterReturningAdvice 返回后通知(后置通知)
-
ThrowsAdvice 异常通知
-
MethodInterceptor 环绕通知 (org.aopalliance.intercept.MethodInterceptor)
前置通知
-
返回后通知+异常通知
环绕通知
在某些业务中,环绕通知也可以不执行目标方法返回其他的值或者执行目标方法之后返回其他的值。
当环绕通知不执行目标方法时,前置通知、后置通知、异常通知失效。
3.配置切面
4.启动工厂测试
四、切入点表达式
1.execution方法级别的切入点表达式
execution(返回值类型 包名.类名.方法名(参数列表))
可以使用*通配0~n个任意字符。子包可以通过..来写,不限参数类型也是..
切入点 符合这个表达式的方法
2. within类级别的切入点表达式
within(包名.类名)
包名和类名本身可以使用*通配0~n个任意字符
切入点 符合这个表达式的类中的所有方法
3.@annotation注解级别的切入点表达式
@annotation(注解类的全限定名)
切入点 被这个注解修饰的方法