Spring AOP常见错误解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

Spring 3.0以后的版本相比于2时代的版本一个重要的变化就是aop所依赖的jar包没有一起发布,需要自己单独下载。

Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理。如果被代理的目标实现了至少一个接口,则会使用JDK动态代理,如果用JDK动态代理,就必须为被代理的目标实现一个接口(要注意的地方是:需要将ctx.getBean()方法的返回值用接口类型接收);。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理,如果使用CGLIB强制代理,就必选事先将CGLIB包导入项目,设置beanNameAutoProxyCreator的proxyTargetClass属性为true。

 

在编写aop程序时,常见的错误有以下几种:

1.如果提示如下错误:

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource[applicationContext.xml]; nested exception is java.lang.NoClassDefFoundError:org/aopalliance/aop/Advice

   atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:412)

   atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)

   atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)

   atorg.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)

   atorg.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)

   atorg.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)

   atorg.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:243)

   atorg.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127)

   atorg.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93)

   atorg.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:131)

   atorg.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:522)

   atorg.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:436)

   atorg.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)

   atorg.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)

   atcom.aoptest.com.Test.main(Test.java:14)

Caused by:java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice

   atjava.lang.ClassLoader.defineClass1(Native Method)

   atjava.lang.ClassLoader.defineClass(ClassLoader.java:800)

   atjava.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)

   atjava.net.URLClassLoader.defineClass(URLClassLoader.java:449)

   atjava.net.URLClassLoader.access$100(URLClassLoader.java:71)

   atjava.net.URLClassLoader$1.run(URLClassLoader.java:361)

   atjava.net.URLClassLoader$1.run(URLClassLoader.java:355)

   atjava.security.AccessController.doPrivileged(NativeMethod)

   atjava.net.URLClassLoader.findClass(URLClassLoader.java:354)

   atjava.lang.ClassLoader.loadClass(ClassLoader.java:425)

   atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)

   atjava.lang.ClassLoader.loadClass(ClassLoader.java:358)

   atjava.lang.ClassLoader.defineClass1(Native Method)

   atjava.lang.ClassLoader.defineClass(ClassLoader.java:800)

   atjava.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)

   atjava.net.URLClassLoader.defineClass(URLClassLoader.java:449)

   atjava.net.URLClassLoader.access$100(URLClassLoader.java:71)

   atjava.net.URLClassLoader$1.run(URLClassLoader.java:361)

   atjava.net.URLClassLoader$1.run(URLClassLoader.java:355)

   atjava.security.AccessController.doPrivileged(NativeMethod)

   atjava.net.URLClassLoader.findClass(URLClassLoader.java:354)

   atjava.lang.ClassLoader.loadClass(ClassLoader.java:425)

   atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)

   atjava.lang.ClassLoader.loadClass(ClassLoader.java:358)

   atjava.lang.ClassLoader.defineClass1(Native Method)

   atjava.lang.ClassLoader.defineClass(ClassLoader.java:800)

   atjava.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)

   atjava.net.URLClassLoader.defineClass(URLClassLoader.java:449)

   atjava.net.URLClassLoader.access$100(URLClassLoader.java:71)

   atjava.net.URLClassLoader$1.run(URLClassLoader.java:361)

   atjava.net.URLClassLoader$1.run(URLClassLoader.java:355)

   atjava.security.AccessController.doPrivileged(NativeMethod)

   atjava.net.URLClassLoader.findClass(URLClassLoader.java:354)

   atjava.lang.ClassLoader.loadClass(ClassLoader.java:425)

   atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)

   atjava.lang.ClassLoader.loadClass(ClassLoader.java:358)

   atorg.springframework.aop.config.ConfigBeanDefinitionParser.getAdviceClass(ConfigBeanDefinitionParser.java:410)

   atorg.springframework.aop.config.ConfigBeanDefinitionParser.createAdviceDefinition(ConfigBeanDefinitionParser.java:366)

   atorg.springframework.aop.config.ConfigBeanDefinitionParser.parseAdvice(ConfigBeanDefinitionParser.java:332)

   atorg.springframework.aop.config.ConfigBeanDefinitionParser.parseAspect(ConfigBeanDefinitionParser.java:227)

   atorg.springframework.aop.config.ConfigBeanDefinitionParser.parse(ConfigBeanDefinitionParser.java:115)

   atorg.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73)

   atorg.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1419)

   atorg.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1409)

   atorg.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:184)

   atorg.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:140)

   atorg.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:111)

   atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)

   atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)

   ...14 more

Caused by: java.lang.ClassNotFoundException: org.aopalliance.aop.Advice

   atjava.net.URLClassLoader$1.run(URLClassLoader.java:366)

   atjava.net.URLClassLoader$1.run(URLClassLoader.java:355)

   atjava.security.AccessController.doPrivileged(NativeMethod)

   atjava.net.URLClassLoader.findClass(URLClassLoader.java:354)

   atjava.lang.ClassLoader.loadClass(ClassLoader.java:425)

   atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)

   atjava.lang.ClassLoader.loadClass(ClassLoader.java:358)

   ...63 more

则说明缺少aop运行所依赖的jar包,需要下载,jar包为

aopalliance-1.0.jar

cglib-nodep-2.2.jar

com.springsource.org.aspectj.tools-1.6.6.RELEASE.jar

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

commons-logging-1.1.3.jar

为了下载方面,我把这几个jar包共享出来,下载地址为:

2.提示以下错误:

Pre-instantiating singletons inorg.springframework.beans.factory.support.DefaultListableBeanFactory@72f08d6f:defining beans [persondaoImpl,transaction,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0];root of factory hierarchy

Exception in thread "main" java.lang.ClassCastException:com.sun.proxy.$Proxy0 cannot be cast to com.aoptest.com.PersonDaoImpl

   atcom.aoptest.com.Test.main(Test.java:15)

这是由于ctx.getBean()方法的返回值用接口的实现类接收,需要将ctx.getBean()方法的返回值改为用接口类型接收。

相关文章
|
11天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
2月前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
70 5
|
2月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
142 2
|
2月前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
59 2
|
2月前
|
前端开发 Java Maven
深入解析:如何用 Spring Boot 实现分页和排序
深入解析:如何用 Spring Boot 实现分页和排序
61 2
|
2月前
|
前端开发 Java 开发者
Spring MVC中的控制器:@Controller注解全解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序控制层的核心。它不仅简化了控制器的定义,还提供了灵活的请求映射和处理机制。本文将深入探讨`@Controller`注解的用法、特点以及在实际开发中的应用。
100 0
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
3月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
87 0
|
11天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
11天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

推荐镜像

更多