您现在的位置是:首页 >技术交流 >0424 spring AOP学习网站首页技术交流
0424 spring AOP学习
AOP是指什么?
面向切面编程,Aspect Oriented Program。是一种编程范式、思想。
Spring AOP里涉及的AOP原理叫什么?
动态代理。
动态代理其实就是在运行时动态的生成目标对象的代理对象,在代理对象中对目标对象的方法进行增强。
例如:
class UserControllerProxy {
private UserController userController;
public void saveUser() {
checkAuth();
userController.saveUser();
}
}
这样在实际调用saveUser()时,我调用的是代理对象的saveUser()方法,从而实现了鉴权。
举一个简单的应用例子
举个例子,你想给你的网站加上鉴权,对某些url,你认为不需要鉴权就可以访问,对于某些url,你认为需要有特定权限的用户才能访问
如果你依然使用OOP,面向对象,那你只能在那些url对应的Controller代码里面,一个一个写上鉴权的代码
使用AOP可以写如下代码:
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/static","/register").permitAll()
.antMatchers("/user/**").hasRoles("USER", "ADMIN")
这样的做法,对原有代码毫无入侵性,这就是AOP的好处了,把和主业务无关的事情,放到代码外面去做。
Spring AOP具体实现方法?
@Repository
public class UserDao {
public void addUser(){
System.out.println("添加用户");
}
public void updateUser(){
System.out.println("修改用户");
}
public void deleteUser(){
System.out.println("删除用户");
}
}
创建一个切面类:
@Aspect
public class MyAspectLog {
/**
* 方法执行完后执行的方法
*/
@After(value="execution(* cn.xh.dao.UserDao.addUser(..))")
public void log(){
System.out.println("记录日志");
}
}
在spring配置文件中加入:(这啥
<!-- 启动@aspectj的自动代理支持-->
<aop:aspectj-autoproxy />
<!-- 定义aspect类 -->
<bean name="myAspect" class="cn.xh.dao. MyAspectLog "/>
AOP 当中的概念:
- 切入点(Pointcut)
在哪些类,哪些方法上切入(where) - 通知(Advice)
在方法执行的什么实际(when:方法前/方法后/方法前后)做什么(what:增强的功能) - 切面(Aspect)
切面 = 切入点 + 通知,通俗点就是:在什么时机,什么地方,做什么增强! - 织入(Weaving)
把切面加入到对象,并创建出代理对象的过程。(由 Spring 来完成)
通知:就是会在目标方法执行前后执行的方法
上面这个例子中:
@After(value="execution(* cn.xh.dao.UserDao.addUser(..))")
public void log(){
System.out.println("记录日志");
}
通过通知和目标方法的执行顺序我们可以把通知分为五种:
- 前置通知(before):在目标方法执行之前执行。
- 后置通知(after):在目标方法执行之后执行
- 后置返回通知(after returning):在目标方法返回之后执行,先执行后置通知再执行后置返回通知。
- 异常通知(after throwing):在目标方法抛出异常时执行
- 环绕通知(around):在目标函数执行中执行
通知的执行顺序如下:
try{
try{
//@Before
method.invoke(..);
}finally{
//@After
}
//@AfterReturning
}catch(){
//@AfterThrowing
}
如何找到需要被aspect的方法的位置?
切入点:应用通知进行增强的目标方法
用这种路径描述:
@After(value="execution(* cn.xh.dao.UserDao.addUser(..))")
这里的含义是cn.xh.dao包UserDao类中的参数任意,返回值任意的addUser方法。
连接点
连接点就是可以应用通知进行增强的方法。
因为Spring Aop只能针对方法进行增强,所以这里的连接点指的就是方法,一旦连接点被增强,它就成为了切入点。如上例中的:
public void addUser(){
System.out.println("添加用户");
}
public void updateUser(){
System.out.println("修改用户");
}
public void deleteUser(){
System.out.println("删除用户");
}
三个方法都是连接点。
作者:夏昊
链接:https://www.zhihu.com/question/24863332/answer/863736101
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
参考:什么是面向切面编程AOP? - 夏昊的回答 - 知乎
https://www.zhihu.com/question/24863332/answer/863736101
项目里有什么用到的地方?
public-endpoint:不需要authorization就可以用的api