• 8.spring框架-----AOP基本知识


    目录

    一、AOP

     二、简单的案例

    1.@Pointcut注解

    2.@Aspect注解

     3.@Before注解

    4.@EnableAspectJAutoProxy注解

    二、AOP工作流程


    一、AOP

    AOP(Aspect Oriented Programming)面向切面编程,一种编程思想,指导开发者如何组织程序结构。AOP是在不改原有代码的前提下对其进行增强,追加功能的,无侵入式编程

     二、简单的案例

    添加BookDao和BookDaoImpl类

    1. public interface BookDao {
    2. public void save();
    3. public void update();
    4. }
    5. @Repository
    6. public class BookDaoImpl implements BookDao {
    7. public void save() {
    8. System.out.println(System.currentTimeMillis());
    9. System.out.println("book dao save ...");
    10. }
    11. @Override
    12. public void update() {
    13. System.out.println("book dao update ...");
    14. }
    15. }

    创建Spring的配置类

    1. @Configuration
    2. @ComponentScan("com.demo.dao")
    3. public class SpringConfig {
    4. }

    编写AppForLifeCycle运行类

    1. public class AppForLifeCycle {
    2. public static void main( String[] args ) {
    3. ApplicationContext ctx = new
    4. AnnotationConfigApplicationContext(SpringConfig.class);
    5. BookDao bookDao = ctx.getBean(BookDao.class);
    6. bookDao.update();
    7. }
    8. }

    目前打印save方法的时候,因为方法中有打印系统时间,所以运行的时候是可以看到系统时间

    对于update方法来说,就没有该功能

    要使用SpringAOP的方式在不改变update方法的前提下让其具有打印系统时间的功能。

     

    在pom.xml添加依赖

    1. <dependency>
    2. <groupId>org.aspectjgroupId>
    3. <artifactId>aspectjweaverartifactId>
    4. <version>1.9.4version>
    5. dependency>

    定义通知类和通知

    1. public class Inform {
    2. public void method(){
    3. System.out.println(System.currentTimeMillis());
    4. }
    5. }

    定义切入点 BookDaoImpl中有两个方法,分别是save和update,我们要增强的是update方法,

    切入点定义依托一个不具有实际意义的方法进行,即无参数、无返回值、方法体无实际逻辑。

    1.@Pointcut注解

    1. public class Inform {
    2. @Pointcut("execution(void com.demo.dao.BookDao.update())")
    3. private void pt(){}
    4. public void method(){
    5. System.out.println(System.currentTimeMillis());
    6. }
    7. }

    制作切面,切面是用来描述通知和切入点之间的关系

     将通知类配给容器并标识其为切面类

    2.@Aspect注解

     3.@Before注解

    1. @Component
    2. @Aspect
    3. public class Inform {
    4. @Pointcut("execution(void com.demo.dao.BookDao.update())")
    5. private void pt(){}
    6. @Before("pt()")
    7. public void method(){
    8. System.out.println(System.currentTimeMillis());
    9. }
    10. }

    开启注解格式AOP功能

    4.@EnableAspectJAutoProxy注解

    1. @Configuration
    2. @ComponentScan("com.demo")
    3. @EnableAspectJAutoProxy
    4. public class SpringConfig {
    5. }

    运行程序

    二、AOP工作流程

     验证容器中是否为代理对象

    1. @Component
    2. @Aspect
    3. public class Inform {
    4. @Pointcut("execution(void com.demo.dao.BookDao.update())")
    5. private void pt(){}
    6. @Before("pt()")
    7. public void method(){
    8. System.out.println(System.currentTimeMillis());
    9. }
    10. }
    1. public class AppForLifeCycle {
    2. public static void main( String[] args ) {
    3. ApplicationContext ctx = new
    4. AnnotationConfigApplicationContext(SpringConfig.class);
    5. BookDao bookDao = ctx.getBean(BookDao.class);
    6. System.out.println(bookDao);
    7. System.out.println(bookDao.getClass());
    8. }
    9. }

    将Inform类中@Pointcut注解update改成update1,重新运行,此时发现爆红,运行结果是BookDaoImp

    @Pointcut("execution(void com.demo.dao.BookDao.update1())")
    

     

     

  • 相关阅读:
    LS1046nfs挂载文件系统
    QT学习总结之QObject详解
    【牛客网】BC146 添加逗号
    Prometheus-Alertmanager 警报管理器-部署和设置
    2024年畜牧、养殖业与智慧农业国际会议(ICLAHSA2024)
    c++ unordered_map和map的区别
    200PLC转以太网通讯远创智控模块在手机平板移动平台中的应用案例题
    手把手教你前后分离架构(五) SpringBoot连接数据库
    六大排序算法(Java版):从插入排序到快速排序(含图解)
    新一代开源语音库CoQui TTS冲到了GitHub 20.5k Star
  • 原文地址:https://blog.csdn.net/qq_46235384/article/details/127624350