Error creating bean with name 'messageSource' defined in ServletContext resource [/WEB-INF/spring.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJPointcutAdvisor]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: warning no match for this type name: add2 [Xlint:invalidAbsoluteTypeName]
SpringAop使用注意事项 顺序
@Around ==》 @Before ==》 @Around ==》 @After ==》 @AfterReturning
@AfterThrowing : 执行目标方法时发生了异常,导致目标方法结束执行。然后@AfterReturning不会执行(目标方法是抛出异常)。目标方法自己有
try-catch没有抛出异常,@AfterReturning会正常执行,只不过拿到的返回值为null。
AspectComponent .java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 package org.example; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; /** * aop组件 */ @Aspect @Component public class AspectComponent { @Pointcut("execution(* org.example.*.*(..))") public void pointCut(){ } // 在目标方法 没有执行的时候开始执行 一般用于改变某个方法的入参值 @Before("pointCut()") public void before(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); User arg = (User) args[0]; System.out.println(arg.getName()+"xingming"); arg.setName("doulongfe"); System.out.println(args); System.out.println("before------------"+joinPoint.toString()); } // 在目标方法执行return前执行 一般可以用于在return前执行插入的业务逻辑 @After("pointCut()") public void after(JoinPoint joinPoint) { Object target = joinPoint.getTarget(); System.out.println(target); System.out.println("after-----------"+joinPoint.toString()); } // 如果同时使用了@Around 这个切面方法的话,这里的返回值是@Around方法的返回值。并不是原来方法的返回值。【出现异常,不执行】 // 一般用于 修改返回值,或者拿到返回值后再执行自己一段业务逻辑 @AfterReturning(pointcut = "pointCut()", returning = "returnVal") public void afterReturning(JoinPoint joinPoint, Object returnVal) { User user = (User) returnVal; System.out.println(user+"更新后返回值"); System.out.println("afterReturning--------------" + returnVal +joinPoint.toString()); } // 一顶要把pjp.proceed();的值return出去,否则会是@AfterReturning 拿不到返回值。 @Around("pointCut()") public Object around(ProceedingJoinPoint pjp) throws Throwable { System.out.println("around start-------===========--------"); try { Object proceed = pjp.proceed(); System.out.println(proceed+"返回值"); return proceed; } catch (Throwable ex) { System.out.println("error in around"); // throw ex; } System.out.println("around end---------===============-----------"); return null; } @AfterThrowing(pointcut = "pointCut()", throwing = "error") public void afterThrowing(JoinPoint joinPoint, Throwable error) { System.out.println("error:" + error+joinPoint.toString()); } // @Around ==》 @Before ==》 @Around ==》 @After ==》 @AfterReturning // @AfterThrowing : 执行目标方法时发生了异常,导致目标方法结束执行。然后@AfterReturning不会执行(目标方法是抛出异常)。目标方法自己有 // try-catch没有抛出异常,@AfterReturning会正常执行,只不过拿到的返回值为null。 }
main.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package org.example; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { System.out.println("Hello world!"); ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml"); System.out.println(ctx.getBean("userService")); // 测试用户服务aop过程 UserService userService=ctx.getBean(UserService.class); User user = new User("jack","123456"); // userService.addUser(user); // System.out.println("======================================================================"); // userService.deleteUser(user); System.out.println("======================================================================"); userService.updateUser(user); ctx.close(); } }
UserService.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 package org.example; import org.springframework.stereotype.Service; /** * 用户服务类 */ @Service public class UserService { /** * 增加用户 */ public void addUser(User user) { System.out.println("增加用户:"+user.toString()); } /** * 删除用户 */ public void deleteUser(User user){ System.out.println("删除用户:"+user.toString()); // throw new RuntimeException("edit person throw exception"); } public User updateUser(User user){ System.out.println("更新用户:"+user.toString()); user.setName("更新了姓名"); try { // int a=1/0; } catch (Exception e) { System.out.println("发生了错误:"+e.getMessage()); } return user; // throw new RuntimeException("edit person throw exception"); } }
User.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 package org.example; /** * 用户类 */ public class User { private String name; private String password; public User() { } public User(String name, String password) { this.name = name; this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "demo.aop.User{" + "name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }
application.xml 在resource目录下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <aop:aspectj-autoproxy /> <context:component-scan base-package="org.example" /> </beans>
pom.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>aopDemo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.9</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.7</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.3.0</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-archetype-plugin</artifactId> <version>3.2.0</version> </plugin> </plugins> </build> </project>