您现在的位置是:首页 >技术交流 >0424 spring AOP学习网站首页技术交流

0424 spring AOP学习

virusos 2023-06-09 16:00:03
简介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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。