【Spring】—— 如何使用AOP(面向切面编程)?

目录

引言

AOP使用

1)导入坐标(pom.xml)

2)制作连接点方法(原始操作、接口与实现类)

3)制作共性功能(通知类与通知)

4)定义切入点

5)绑定切入点与通知关系

6)定义通知类受Spring容器管理,并定义当前类为切面类

7)配置类


引言

AOP(面向切面编程):一种编程范式,指导开发者如何组织程序结构。

作用:在不改变原始设计的基础上进行功能增强。

如以下代码:如何再不改变此类的基础上,使后三个方法达到与save方法同样的效果?

public class BookDaoImpl implements BookDao {
    public void save(){
        Long startTime = System.currentTimeMillis();
        for(int i = 0;i < 10000;i++)
            System.out.println("book dao save...");
        Long endTime = System.currentTimeMillis();
        Long totalTime = endTime-startTime;
        System.out.println(totalTime + "ms");
    }

    public void update(){
        System.out.println("book dao update...");
    }
    public void delete(){
        System.out.println("book dao delete...");
    }
    public void select(){
        System.out.println("book dao select...");
    }

}

AOP使用

1)导入坐标(pom.xml)

pom.xml文件加入以下坐标,注意加入后刷新maven。

    
        
            org.springframework
            spring-context
            6.0.9
        
        
            org.aspectj
            aspectjweaver
            1.9.4
        
    

2)制作连接点方法(原始操作、接口与实现类)

@Repository
public class BookDaoImpl implements BookDao {
    public void save(){
        System.out.println(System.currentTimeMillis());
        System.out.println("book dao save...");
    }

    public void update(){
        System.out.println("book dao update...");
    }

}

3)制作共性功能(通知类与通知)

public class MyAdvice {
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

4)定义切入点

切入点是匹配连接点的式子

public class MyAdvice {
    @Pointcut("execution(void com.spring.dao.BookDao.update())")
    private void pt(){}

}

5)绑定切入点与通知关系

public class MyAdvice {
    @Pointcut("execution(void com.spring.dao.BookDao.update())")
    private void pt(){}

    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

6)定义通知类受Spring容器管理,并定义当前类为切面类

加入@Component和@Aspect

切面是描述通知与切入点的对应关系

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(void com.spring.dao.BookDao.update())")
    private void pt(){}

    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

7)配置类

@EnableAspectJAutoProxy开启Spring对AOP注解驱动支持

@Configuration
@ComponentScan("com.spring")
@EnableAspectJAutoProxy
public class SpringConfig {
}

你可能感兴趣的:(Spring,spring,java,后端)