Spring AOP在web应用中的使用方法实例

时间:2021-05-19

前言

之前的aop是通过手动创建代理类来进行通知的,但是在日常开发中,我们并不愿意在代码中硬编码这些代理类,我们更愿意使用DI和IOC来管理aop代理类。Spring为我们提供了以下方式来使用aop框架

一、以声明的方式配置AOP(就是使用xml配置文件)

1.使用ProxyFactoryBean的方式:

ProxyFactoryBean类是FactoryBean的一个实现类,它允许指定一个bean作为目标,并且为该bean提供一组通知和顾问(这些通知和顾问最终会被合并到一个AOP代理中)它和我们之前的ProxyFactory都是Advised的实现。

以下是一个简单的例子:一个学生和一个老师,老师会告诉学生应该做什么。

public class Student { public void talk() { System.out.println("I am a boy"); } public void walk() { System.out.println("I am walking"); } public void sleep() { System.out.println("I want to sleep"); }}

老师类

public class Teacher { private Student student; public void tellStudent(){ student.sleep(); student.talk(); } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; }}

我们创建一个通知类,这个和之前是一样的SpringAOP中的通知类型以及创建

package cn.lyn4ever.aop;import org.aspectj.lang.JoinPoint;public class AuditAdvice implements MethodBeforeAdvice { @Override public void before(Method method, Object[] objects, @Nullable Object o) throws Throwable { System.out.println("这个方法被通知了" + method.getName()); }}

然后就使用spring的IOC来管理这个通知类,在xml配置文件中声明如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://ponentScan("cn.lyn4ever.aop.aspectj")@EnableAspectJAutoProxy(proxyTargetClass = true)//相当于xml中的<aop:aspectj-autoproxy/>public class BeanConfig {}

测试方法

package cn.lyn4ever.aop.aspectj;import cn.lyn4ever.aop.aopconfig.Teacher;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.support.GenericApplicationContext;import org.springframework.context.support.GenericXmlApplicationContext;public class AspectMain { public static void main(String[] args) {// xmlConfig(); javaConfig(); } private static void javaConfig() { GenericApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class); HighStudent student = (HighStudent) context.getBean("highStudent"); student.sleep(new Teacher());//应该被环绕通知 System.out.println(); student.talk();//前置通知 System.out.println(); student.walk();//不会被通知 System.out.println(); } private static void xmlConfig(){ GenericXmlApplicationContext context = new GenericXmlApplicationContext(); context.load("application_aspect.xml"); context.refresh(); HighStudent student = (HighStudent) context.getBean("highStudent"); student.sleep(new Teacher());//应该被环绕通知 System.out.println(); student.talk();//前置通知 System.out.println(); student.walk();//不会被通知 System.out.println(); }}

项目代码地址,如果觉得还不错的话,给个star吧

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章