栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring-AOP

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring-AOP

文章目录
  • AOP概念理解
    • Demo1
      • step1.导入aop依赖
      • step2.定义userDao接口和实现类
      • step3.定义通知类,制作通知
      • step4.定义切入点
      • step5:添加切入点和通知之间的关系
      • step6:定义通知类受spring容器管理
      • step7:开启Spring对AOP注解驱动支撑
      • step8:run一下
  • AOP工作流程
  • AOP切入点表达式
    • 切入点表达式
    • 通配符
    • 书写技巧
  • AOP通知类型
    • 前置通知
    • 后置通知
    • 环绕通知※
  • AOP通知获取数据
  • AOP总结

AOP概念理解


参考博客

连接点:所有方法。
切入点:哪些方法需要追加功能的,匹配通知的方法,叫切入点。
通知:各个方法共用的功能,叫通知。通知存在于通知类中。
切面:切面描述的是通知共用的功能与所对应切入点的关系。在哪些切入点上执行哪些通知叫切面。

Demo1

接口UserDao.java

public interface UserDao {
    public void save();
    public void update();
}

实现类UserDaoImpl.java

@Component("userDao")
public class UserDaoImpl implements UserDao {
    private String username;
    public void setName(String name){
        this.username=name;
    }
    public void save() {
        System.out.println(System.currentTimeMillis());
        System.out.println("user dao save ...");
    }
    public void update(){
        System.out.println("user dao update...");
    }
}

APP6.java程序

public class APP6 {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
        UserDao userDao=(UserDao) ctx.getBean("userDao");
        userDao.update();
    }
}

userDao.save结果

userDao.update结果

这里调用userDao.update无法显示时间,接下来用AOP的方法进一步实现。

step1.导入aop依赖


   org.springframework
   spring-context
   5.2.10.RELEASE


   org.aspectj
   aspectjweaver
   1.9.4

step2.定义userDao接口和实现类

userDao接口和实现类在前面给了具体书写方法

step3.定义通知类,制作通知



public class MyAdvice {
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}
step4.定义切入点

public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.UserDao.update())")
    private void pt(){}
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}
step5:添加切入点和通知之间的关系

public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.UserDao.update())")
    private void pt(){}
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}
step6:定义通知类受spring容器管理

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.UserDao.update())")
    private void pt(){}
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}
step7:开启Spring对AOP注解驱动支撑

@Configuration
@Import({jdbcConfig.class})
@ComponentScan("com.itheima")
@EnableAspectJAutoProxy
public class SpringConfig {
//    1.定义方法获得要管理的对象
//    2.添加@Bean,表示当前返回值是一个Bean
}
step8:run一下

APP6.java

public class APP6 {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
        UserDao userDao=(UserDao) ctx.getBean("userDao");
        userDao.update();
    }
}

okk!

AOP工作流程

AOP切入点表达式 切入点表达式


通配符

书写技巧

AOP通知类型 前置通知

后置通知

环绕通知※



UserDaoImpl.java

@Component("userDao")
public class UserDaoImpl implements UserDao {
    private String username;
    public void setName(String name){
        this.username=name;
    }
    public void save() {
        System.out.println(System.currentTimeMillis());
        System.out.println("user dao save ...");
    }
    public void update(){
        System.out.println("user dao update...");
    }
    public int select(){
        System.out.println("book dao select is running...");
        return 666;
    }
}

MyAdvice.java

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(int com.itheima.dao.UserDao.select())")
    private void pt(){}
    @Around("pt()")
    public Object method(ProceedingJoinPoint pjp) throws Throwable {
//        System.out.println(System.currentTimeMillis());
        System.out.println("hello1");
        Object tmp=pjp.proceed();
        System.out.println("hello2");
        return tmp;
    }
}



AOP通知获取数据


//注解中的returing和形参需要保持一致
@AfterReturing(value = "pt()",returing="ret")
public void afterReturning(String ret){
    
}


AOP总结






参考博客

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/996314.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号