AOP 通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置
- @Pointcut("execution(void org.example.dao.BookDao.update())")
- private void pt() {
- }
-
- @Before("pt()")
- public void before() {
- System.out.println("before advice");
- }
- @Pointcut("execution(void org.example.dao.BookDao.update())")
- private void pt() {
- }
-
- @After("pt()")
- public void after() {
- System.out.println("after advice");
- }
显然原始方法不执行了
- @Pointcut("execution(void org.example.dao.BookDao.update())")
- private void pt() {
- }
-
- @Around("pt()")
- public void around() {
- System.out.println("around before advice");
- System.out.println("around after advice");
- }
- @Pointcut("execution(void org.example.dao.BookDao.update())")
- private void pt() {
- }
-
- @Around("pt()")
- public void around(ProceedingJoinPoint pjp) throws Throwable {
- System.out.println("around before advice");
- pjp.proceed();
- System.out.println("around after advice");
- }
- @Around("pt()")
- public Object around(ProceedingJoinPoint pjp) throws Throwable {
- System.out.println("around before advice");
- Object obj=pjp.proceed();
- System.out.println("around after advice");
- return obj;
- }
成功运行后执行
- @Pointcut("execution(void org.example.dao.BookDao.update())")
- private void pt() {
- }
-
- @AfterReturning("pt()")
- public void afterReturning() {
- System.out.println("afterReturning advice");
- }
如果抛出异常,AfterReturning不运行,但After正常运行
- @Pointcut("execution(void org.example.dao.BookDao.update())")
- private void pt() {
- }
-
- @AfterThrowing("pt()")
- public void afterThrowing() {
- System.out.println("afterThrowing advice");
- }
- package org.example.dao.impl;
-
- import org.example.dao.BookDao;
- import org.springframework.stereotype.Repository;
-
- @Repository
- public class BookDaoImpl implements BookDao {
-
- public void save() {
- System.out.println("book dao save");
- }
-
-
- public void update() {
- System.out.println("book dao update");
- }
-
- public void delete() {
- System.out.println("book dao delete");
- }
-
- public int select() {
- System.out.println("book dao select");
- return 100;
- }
- }
- package org.example.config;
-
- import org.springframework.context.annotation.ComponentScan;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.context.annotation.EnableAspectJAutoProxy;
-
- @Configuration
- @ComponentScan("org.example")
- @EnableAspectJAutoProxy//有用注解开发的AOP
- public class SpringConfig {
- }
- package org.example.aop;
-
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.*;
- import org.springframework.stereotype.Component;
-
- @Component
- @Aspect//当作Aop处理
- public class MyAdvice {
- @Pointcut("execution(void org.example.dao.BookDao.update())")
- private void pt() {
- }
-
- @Before("pt()")
- public void before() {
- System.out.println("before advice");
- }
-
- @After("pt()")
- public void after() {
- System.out.println("after advice");
- }
-
- @Around("pt()")
- public Object around(ProceedingJoinPoint pjp) throws Throwable {
- System.out.println("around before advice");
- Object obj = pjp.proceed();
- System.out.println("around after advice");
- return obj;
- }
-
- @AfterReturning("pt()")
- public void afterReturning() {
- System.out.println("afterReturning advice");
- }
-
- @AfterThrowing("pt()")
- public void afterThrowing() {
- System.out.println("afterThrowing advice");
- }
- }
- package org.example.dao;
-
- public interface BookDao {
- void save();
- void update();
- int select();
- }
- package org.example;
-
- import org.example.config.SpringConfig;
- import org.example.dao.BookDao;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-
- /**
- * Hello world!
- *
- */
- public class App
- {
- public static void main( String[] args )
- {
- ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
- BookDao bookDao=ctx.getBean(BookDao.class);
- bookDao.update();
- }
- }
- package org.example.aop;
-
- import org.aspectj.lang.JoinPoint;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.*;
- import org.springframework.stereotype.Component;
-
- import java.util.Arrays;
-
- @Component
- @Aspect//当作Aop处理
- public class MyAdvice {
- @Pointcut("execution(* org.example.dao.BookDao.findName(..))")
- private void pt() {
- }
-
- @Before("pt()")
- public void before(JoinPoint jp) {
- Object[] args = jp.getArgs();
- System.out.println("before advice:" + Arrays.toString(args));
- }
-
- @After("pt()")
- public void after(JoinPoint jp) {
- Object[] args = jp.getArgs();
- System.out.println("after advice:" + Arrays.toString(args));
- }
-
- @Around("pt()")
- public Object around(ProceedingJoinPoint pjp) throws Throwable {
- System.out.println("around before advice");
- Object obj = pjp.proceed();
- Object[] args = pjp.getArgs();
- System.out.println("around after advice:" + Arrays.toString(args));
- return obj;
- }
-
- @AfterReturning(value = "pt()", returning = "res")
- public void afterReturning(Object res) {
- System.out.println("afterReturning advice:" + res);
- }
-
- @AfterThrowing(value = "pt()", throwing = "t")
- public void afterThrowing(Throwable t) {
- System.out.println("afterThrowing advice"+t);
- }
- }
- package org.example.dao;
-
- public interface BookDao {
-
- String findName(int id);
-
- }