博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring框架学习笔记5:SpringAOP示例
阅读量:4654 次
发布时间:2019-06-09

本文共 5638 字,大约阅读时间需要 18 分钟。

1.导包:

导入spring中的这两个包

 

再导入其他包(网上下载):

 

2.准备目标对象:

package service;public class UserServiceImpl implements UserService {    @Override    public void save() {        System.out.println("保存用户!");    }    @Override    public void delete() {        System.out.println("删除用户!");    }    @Override    public void update() {        System.out.println("更新用户!");    }    @Override    public void find() {        System.out.println("查找用户!");    }}
View Code

 

3.准备通知:

package springaop;import org.aspectj.lang.ProceedingJoinPoint;//通知类public class MyAdvice {        //前置通知    //        |-目标方法运行之前调用    //后置通知(如果出现异常不会调用)//        |-在目标方法运行之后调用    //环绕通知//        |-在目标方法之前和之后都调用    //异常拦截通知//        |-如果出现异常,就会调用    //后置通知(无论是否出现 异常都会调用)//        |-在目标方法运行之后调用//----------------------------------------------------------------    //前置通知    public void before(){        System.out.println("这是前置通知!!");    }    //后置通知    public void afterReturning(){        System.out.println("这是后置通知(如果出现异常不会调用)!!");    }    //环绕通知    public Object around(ProceedingJoinPoint pjp) throws Throwable {        System.out.println("这是环绕通知之前的部分!!");        Object proceed = pjp.proceed();//调用目标方法        System.out.println("这是环绕通知之后的部分!!");        return proceed;    }    //异常通知    public void afterException(){        System.out.println("出现异常了!");    }    //后置通知    public void after(){        System.out.println("这是后置通知(出现异常也会调用)!");    }}

 

 

4.配置将通知织入目标对象

(导入aop约束)

 

bean包的user对象:

package bean;import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;import javax.annotation.Resource;import org.junit.validator.PublicClassValidator;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Component;import org.springframework.stereotype.Controller;import org.springframework.stereotype.Repository;import org.springframework.stereotype.Service;//代替的配置文件内容
// @Component("user")//四种本质相同,为了方便理解建议使用以下三种// @Service("user")//service层使用// @Controller("user")//web层使用 @Repository("user")//dao层使用//指定对象的作用范围@Scope(scopeName="singleton")public class User { @Value("Tom")//赋值 private String name; private Integer age; //@Autowired//对象赋值,自动装配 //存在问题:如果是多个类型一致的对象,无法分辨 @Resource(name="car")//这种方式可以明确指定(推荐) private Car car; public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } @Value("20")//也可以在set方法赋值,效果一样,但不破坏封装性 public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", car=" + car + "]"; } @PostConstruct//初始化方法,当相于配置文件中的init-mothod public void init(){ System.out.println("初始化"); } @PreDestroy//销毁方法 public void destory(){ System.out.println("销毁"); } }

 

 

 

xml配置文件:

 

 

测试类:

package springaop;import javax.annotation.Resource;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import bean.User;import service.UserService;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:springaop/applicationContext.xml")public class Demo {    @Resource(name="userService")    private UserService us;        @Test    public void fun1(){        us.save();    }    }

 

 

调用sava方法:控制台打印如下

 

 

 

 

补充(这种方式不推荐,了解即可):

可以不使用xml配置文件,改为注解

package annotationaop;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;//通知类@Aspect//表示该类是一个通知类public class MyAdvice {    @Pointcut("execution(* service.*ServiceImpl.*(..))")    public void pc(){}    //前置通知    //指定该方法是前置通知,并制定切入点    @Before("MyAdvice.pc()")    public void before(){        System.out.println("这是前置通知!!");    }    //后置通知    @AfterReturning("MyAdvice.pc()")    public void afterReturning(){        System.out.println("这是后置通知(如果出现异常不会调用)!!");    }    //环绕通知    @Around("MyAdvice.pc()")    public Object around(ProceedingJoinPoint pjp) throws Throwable {        System.out.println("这是环绕通知之前的部分!!");        Object proceed = pjp.proceed();//调用目标方法        System.out.println("这是环绕通知之后的部分!!");        return proceed;    }    //异常通知    @AfterThrowing("MyAdvice.pc()")    public void afterException(){        System.out.println("出现异常了!");    }    //后置通知    @After("MyAdvice.pc()")    public void after(){        System.out.println("这是后置通知(出现异常也会调用)!!");    }}

 

配置文件做相应修改:

 

转载于:https://www.cnblogs.com/xuyiqing/p/8464465.html

你可能感兴趣的文章
夏天过去了, 姥爷推荐几套来自smashingmagzine的超棒秋天主题壁纸
查看>>
反射的所有api
查看>>
css 定位及遮罩层小技巧
查看>>
[2017.02.23] Java8 函数式编程
查看>>
sprintf 和strcpy 的差别
查看>>
JS中window.event事件使用详解
查看>>
ES6深入学习记录(一)class方法相关
查看>>
C语言对mysql数据库的操作
查看>>
INNO SETUP 获得命令行参数
查看>>
HTML5与CSS3权威指南之CSS3学习记录
查看>>
docker安装部署
查看>>
AVL树、splay树(伸展树)和红黑树比较
查看>>
多媒体音量条显示异常跳动
查看>>
运算符及题目(2017.1.8)
查看>>
React接入Sentry.js
查看>>
ssh自动分发密匙脚本样板
查看>>
转 小辉_Ray CORS(跨域资源共享)
查看>>
Linux安装postgresql
查看>>
MyBatis启动:MapperStatement创建
查看>>
【 全干货 】5 分钟带你看懂 Docker !
查看>>