`
jinnianshilongnian
  • 浏览: 21432126 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2404633
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997324
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631174
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257473
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593044
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248922
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847149
Group-logo
跟我学Nginx+Lua开...
浏览量:697994
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780320
社区版块
存档分类
最新评论

【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我学spring3

阅读更多

 

6.2.1  准备环境

       首先准备开发需要的jar包,请到spring-framework-3.0.5.RELEASE-dependencies.zip和spring-framework-3.0.5.RELEASE-with-docs中查找如下jar包:

 
 

org.springframework.aop-3.0.5.RELEASE.jar

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

com.springsource.org.aopalliance-1.0.0.jar

com.springsource.net.sf.cglib-2.2.0.jar

 

 

 

 

 

 

 

 

 

将这些jar包添加到“Build Path”下。

 

6.2.2  定义目标类

       1)定义目标接口:

 

java代码:
  1. package cn.javass.spring.chapter6.service;  
  2. public interface IHelloWorldService {  
  3.     public void sayHello();  
  4. }  

 

       2)定义目标接口实现:

 

java代码:
  1. package cn.javass.spring.chapter6.service.impl;  
  2. import cn.javass.spring.chapter6.service.IHelloWorldService;  
  3. public class HelloWorldService implements IHelloWorldService {  
  4.     @Override  
  5.     public void sayHello() {  
  6.         System.out.println("============Hello World!");  
  7.     }  
  8. }  
  9.    

 

       注:在日常开发中最后将业务逻辑定义在一个专门的service包下,而实现定义在service包下的impl包中,服务接口以IXXXService形式,而服务实现就是XXXService,这就是规约设计,见名知义。当然可以使用公司内部更好的形式,只要大家都好理解就可以了。

 

6.2.2  定义切面支持类

       有了目标类,该定义切面了,切面就是通知和切入点的组合,而切面是通过配置方式定义的,因此这定义切面前,我们需要定义切面支持类,切面支持类提供了通知实现:

 

java代码:
  1. package cn.javass.spring.chapter6.aop;  
  2. public class HelloWorldAspect {  
  3.        //前置通知  
  4.     public void beforeAdvice() {  
  5.         System.out.println("===========before advice");  
  6. }  
  7. //后置最终通知  
  8.     public void afterFinallyAdvice() {  
  9.         System.out.println("===========after finally advice");  
  10.     }  
  11. }  

 

       此处HelloWorldAspect类不是真正的切面实现,只是定义了通知实现的类,在此我们可以把它看作就是缺少了切入点的切面。

 

       注:对于AOP相关类最后专门放到一个包下,如“aop”包,因为AOP是动态织入的,所以如果某个目标类被AOP拦截了并应用了通知,可能很难发现这个通知实现在哪个包里,因此推荐使用规约命名,方便以后维护人员查找相应的AOP实现。

 

6.2.3  在XML中进行配置

       有了通知实现,那就让我们来配置切面吧:

       1)首先配置AOP需要aop命名空间,配置头如下:

 

java代码:
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  xmlns="http://www.springframework.org/schema/beans"  
  3.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.         xmlns:aop="http://www.springframework.org/schema/aop"  
  5.         xsi:schemaLocation="  
  6.            http://www.springframework.org/schema/beans  
  7.            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  8.            http://www.springframework.org/schema/aop  
  9.            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">  
  10. </beans>  
  11.    

 

 

       2)配置目标类:

 

java代码:
  1. <bean id="helloWorldService"  
  2. class="cn.javass.spring.chapter6.service.impl.HelloWorldService"/>  
  3.    

 

       3)配置切面:

 

java代码:
  1. <bean id="aspect" class="cn.javass.spring.chapter6.aop.HelloWorldAspect"/>  
  2. <aop:config>  
  3. <aop:pointcut id="pointcut" expression="execution(* cn.javass..*.*(..))"/>  
  4.     <aop:aspect ref="aspect">  
  5.         <aop:before pointcut-ref="pointcut" method="beforeAdvice"/>  
  6.         <aop:after pointcut="execution(* cn.javass..*.*(..))" method="afterFinallyAdvice"/>  
  7.     </aop:aspect>  
  8. </aop:config>  

 

       切入点使用<aop:config>标签下的<aop:pointcut>配置,expression属性用于定义切入点模式,默认是AspectJ语法,“execution(* cn.javass..*.*(..))”表示匹配cn.javass包及子包下的任何方法执行。

 

切面使用<aop:config>标签下的<aop:aspect>标签配置,其中“ref”用来引用切面支持类的方法。

 

前置通知使用<aop:aspect>标签下的<aop:before>标签来定义,pointcut-ref属性用于引用切入点Bean,而method用来引用切面通知实现类中的方法,该方法就是通知实现,即在目标类方法执行之前调用的方法。

 

最终通知使用<aop:aspect>标签下的<aop:after >标签来定义,切入点除了使用pointcut-ref属性来引用已经存在的切入点,也可以使用pointcut属性来定义,如pointcut="execution(* cn.javass..*.*(..))",method属性同样是指定通知实现,即在目标类方法执行之后调用的方法。

 

6.2.4    运行测试

测试类非常简单,调用被代理Bean跟调用普通Bean完全一样,Spring AOP将为目标对象创建AOP代理,具体测试代码如下:

 

java代码:
  1. package cn.javass.spring.chapter6;  
  2. import org.junit.Test;  
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5. import cn.javass.spring.chapter6.service.IHelloWorldService;  
  6. import cn.javass.spring.chapter6.service.IPayService;  
  7. public class AopTest {  
  8.     @Test  
  9.     public void testHelloworld() {  
  10.         ApplicationContext ctx =  new ClassPathXmlApplicationContext("chapter6/helloworld.xml");  
  11.         IHelloWorldService helloworldService =  
  12.         ctx.getBean("helloWorldService", IHelloWorldService.class);  
  13.         helloworldService.sayHello();  
  14.     }  
  15. }  
  16.    

 

       该测试将输出如下如下内容:

 

java代码:
  1. ===========before advice  
  2. ============Hello World!  
  3. ===========after finally advice  

 

 

       从输出我们可以看出:前置通知在切入点选择的连接点(方法)之前允许,而后置通知将在连接点(方法)之后执行,具体生成AOP代理及执行过程如图6-4所示。

 

图6-4 Spring AOP框架生成AOP代理过程

 

 

原创内容 转自请注明出处【http://sishuok.com/forum/blogPost/list/2467.html


 

分享到:
评论
42 楼 DEAR贴 2017-07-21  
切面植入的时机是什么呢
41 楼 yang408485700 2016-08-11  
Cool1 写道
jinnianshilongnian 写道
zhuguopei_java 写道

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'helloWorldService' defined in class path resource [helloworld.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': Cannot create inner bean '(inner bean)' of type [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Cannot create inner bean '(inner bean)' of type [org.springframework.aop.config.MethodLocatingFactoryBean] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Initialization of bean failed; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [spring.aop.HelloWorldAspect] for bean with name 'aspect' defined in class path resource [helloworld.xml]; nested exception is java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect
Related cause: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [spring.aop.HelloWorldAspect] for bean with name 'aspect' defined in class path resource [helloworld.xml]; nested exception is java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect
找了N长时间了,就是解决不了  


没有导入后三个包。



java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect

你仔细检查下这个类路径写没写错; 有木有在classpath下,

这个好像和版本有一定的问题,我在4.0的版本下也是出现这个问题,然后换成了3.1之后就没问题了。

40 楼 hx252502115 2016-08-09  
浮生还闲了半天 写道
<aop:before pointcut-ref="pointcut" method="beforeAdvice"/> 
        <aop:before pointcut-ref="pointcut" method="beforeAdvice"/>
        <aop:after pointcut="execution(* cn.javass..*.*(..))" method="afterFinallyAdvice"/> 
老师 这样写的话结果是
===========before advice
============Hello World!
===========before advice
===========after finally advice
还是有一条在后面
  <aop:before pointcut-ref="pointcut" method="beforeAdvice"/> 
      
        <aop:after pointcut="execution(* cn.javass..*.*(..))" method="afterFinallyAdvice"/>
结果是:
============Hello World!
===========before advice
===========after finally advice
这是因为 hello world!运行太快的原因吗


贴出完整的配置看看,这个和hello world运行快慢没有关系
39 楼 浮生还闲了半天 2016-05-03  
<aop:before pointcut-ref="pointcut" method="beforeAdvice"/> 
        <aop:before pointcut-ref="pointcut" method="beforeAdvice"/>
        <aop:after pointcut="execution(* cn.javass..*.*(..))" method="afterFinallyAdvice"/> 
老师 这样写的话结果是
===========before advice
============Hello World!
===========before advice
===========after finally advice
还是有一条在后面
  <aop:before pointcut-ref="pointcut" method="beforeAdvice"/> 
      
        <aop:after pointcut="execution(* cn.javass..*.*(..))" method="afterFinallyAdvice"/>
结果是:
============Hello World!
===========before advice
===========after finally advice
这是因为 hello world!运行太快的原因吗
38 楼 浮生还闲了半天 2016-05-03  
============Hello World!
===========before advice
===========after finally advice
老师我的输出结果是这样的 before advice没有前置  xml对了好几遍了
37 楼 youyao816 2016-03-07  
本兮挚爱桃子 写道
配置。。。。。
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans       
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context               
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop       
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

<bean id="telSender" class="com.ccitsoft.Interface.TelSender" />

<bean id="aspect" class="com.ccitsoft.Interface.AspectSender">
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* com.ccitsoft.Interface.*.*(..))" />

<aop:aspect ref="aspect">
<aop:before pointcut-ref="pointcut" method="beforeAdvice" />
<aop:after pointcut-ref="pointcut" method="afterAdvice" />
</aop:aspect>
</aop:config>


</bean>

</beans> 


测试类。。。。。
package com.ccitsoft.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.ccitsoft.Interface.TelSender;

public class TestAspect {

@Test
public void test() {

ApplicationContext cxt = new ClassPathXmlApplicationContext("aspectSender.xml");

TelSender sender = cxt.getBean("telSender", TelSender.class);


sender.sender();

}

}
异常。。。。。。。。。
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Cannot locate BeanDefinitionDecorator for element [config]
Offending resource: class path resource [aspectSender.xml]
at org.springframework.beans.factory.parsing.FailFastProblemReporter.fatal(FailFastProblemReporter.java:59)
at org.springframework.beans.factory.parsing.ReaderContext.fatal(ReaderContext.java:68)
at org.springframework.beans.factory.parsing.ReaderContext.fatal(ReaderContext.java:55)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.findDecoratorForNode(NamespaceHandlerSupport.java:119)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.decorate(NamespaceHandlerSupport.java:97)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.decorateIfRequired(BeanDefinitionParserDelegate.java:1372)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired(BeanDefinitionParserDelegate.java:1359)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired(BeanDefinitionParserDelegate.java:1339)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.processBeanDefinition(DefaultBeanDefinitionDocumentReader.java:261)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentReader.java:154)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:133)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:126)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:92)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:465)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:395)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.ccitsoft.test.TestAspect.test(TestAspect.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

老师。有时间帮忙看下、貌似是哪个表达式有问题?
aop:config 不要写在bean里面
36 楼 youyao816 2016-03-07  
本兮挚爱桃子 写道
配置。。。。。
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans       
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context               
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop       
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

<bean id="telSender" class="com.ccitsoft.Interface.TelSender" />

<bean id="aspect" class="com.ccitsoft.Interface.AspectSender">
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* com.ccitsoft.Interface.*.*(..))" />

<aop:aspect ref="aspect">
<aop:before pointcut-ref="pointcut" method="beforeAdvice" />
<aop:after pointcut-ref="pointcut" method="afterAdvice" />
</aop:aspect>
</aop:config>


</bean>

</beans> 


测试类。。。。。
package com.ccitsoft.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.ccitsoft.Interface.TelSender;

public class TestAspect {

@Test
public void test() {

ApplicationContext cxt = new ClassPathXmlApplicationContext("aspectSender.xml");

TelSender sender = cxt.getBean("telSender", TelSender.class);


sender.sender();

}

}
异常。。。。。。。。。
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Cannot locate BeanDefinitionDecorator for element [config]
Offending resource: class path resource [aspectSender.xml]
at org.springframework.beans.factory.parsing.FailFastProblemReporter.fatal(FailFastProblemReporter.java:59)
at org.springframework.beans.factory.parsing.ReaderContext.fatal(ReaderContext.java:68)
at org.springframework.beans.factory.parsing.ReaderContext.fatal(ReaderContext.java:55)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.findDecoratorForNode(NamespaceHandlerSupport.java:119)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.decorate(NamespaceHandlerSupport.java:97)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.decorateIfRequired(BeanDefinitionParserDelegate.java:1372)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired(BeanDefinitionParserDelegate.java:1359)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired(BeanDefinitionParserDelegate.java:1339)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.processBeanDefinition(DefaultBeanDefinitionDocumentReader.java:261)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentReader.java:154)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:133)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:126)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:92)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:465)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:395)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.ccitsoft.test.TestAspect.test(TestAspect.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

老师。有时间帮忙看下、貌似是哪个表达式有问题?
我也遇到了  怎么解决的?
35 楼 Cool1 2015-05-04  
jinnianshilongnian 写道
zhuguopei_java 写道

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'helloWorldService' defined in class path resource [helloworld.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': Cannot create inner bean '(inner bean)' of type [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Cannot create inner bean '(inner bean)' of type [org.springframework.aop.config.MethodLocatingFactoryBean] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Initialization of bean failed; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [spring.aop.HelloWorldAspect] for bean with name 'aspect' defined in class path resource [helloworld.xml]; nested exception is java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect
Related cause: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [spring.aop.HelloWorldAspect] for bean with name 'aspect' defined in class path resource [helloworld.xml]; nested exception is java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect
找了N长时间了,就是解决不了  




java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect

你仔细检查下这个类路径写没写错; 有木有在classpath下,

这个好像和版本有一定的问题,我在4.0的版本下也是出现这个问题,然后换成了3.1之后就没问题了。
34 楼 本兮挚爱桃子 2014-04-28  
配置。。。。。
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans       
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context               
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop       
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

<bean id="telSender" class="com.ccitsoft.Interface.TelSender" />

<bean id="aspect" class="com.ccitsoft.Interface.AspectSender">
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* com.ccitsoft.Interface.*.*(..))" />

<aop:aspect ref="aspect">
<aop:before pointcut-ref="pointcut" method="beforeAdvice" />
<aop:after pointcut-ref="pointcut" method="afterAdvice" />
</aop:aspect>
</aop:config>


</bean>

</beans> 


测试类。。。。。
package com.ccitsoft.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.ccitsoft.Interface.TelSender;

public class TestAspect {

@Test
public void test() {

ApplicationContext cxt = new ClassPathXmlApplicationContext("aspectSender.xml");

TelSender sender = cxt.getBean("telSender", TelSender.class);


sender.sender();

}

}
异常。。。。。。。。。
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Cannot locate BeanDefinitionDecorator for element [config]
Offending resource: class path resource [aspectSender.xml]
at org.springframework.beans.factory.parsing.FailFastProblemReporter.fatal(FailFastProblemReporter.java:59)
at org.springframework.beans.factory.parsing.ReaderContext.fatal(ReaderContext.java:68)
at org.springframework.beans.factory.parsing.ReaderContext.fatal(ReaderContext.java:55)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.findDecoratorForNode(NamespaceHandlerSupport.java:119)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.decorate(NamespaceHandlerSupport.java:97)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.decorateIfRequired(BeanDefinitionParserDelegate.java:1372)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired(BeanDefinitionParserDelegate.java:1359)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired(BeanDefinitionParserDelegate.java:1339)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.processBeanDefinition(DefaultBeanDefinitionDocumentReader.java:261)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentReader.java:154)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:133)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:126)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:92)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:465)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:395)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.ccitsoft.test.TestAspect.test(TestAspect.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

老师。有时间帮忙看下、貌似是哪个表达式有问题?
33 楼 jinnianshilongnian 2013-10-09  
lovme_forever 写道
1、如果这样加载xml文件的话,
Resource rc = new FileSystemResource(new File("src/aop/aop.xml"));
@SuppressWarnings("deprecation")
BeanFactory ctx = new XmlBeanFactory(rc);
HelloWoldService hello = (HelloWoldService) ctx.getBean("helloWorldService");
hello.sayHello();


输出结果
============Hello World!

2、如果下面这种,输出就会正常
ApplicationContext ctx = new ClassPathXmlApplicationContext("file:src/aop/aop.xml");
HelloWoldService hello = (HelloWoldService) ctx.getBean("helloWorldService");
hello.sayHello();

输出结果
===========before advice
============Hello World!
===========after finally advice

BeanFactory没有如aop、消息、资源加载、事件等功能
32 楼 lovme_forever 2013-10-08  
1、如果这样加载xml文件的话,
Resource rc = new FileSystemResource(new File("src/aop/aop.xml"));
@SuppressWarnings("deprecation")
BeanFactory ctx = new XmlBeanFactory(rc);
HelloWoldService hello = (HelloWoldService) ctx.getBean("helloWorldService");
hello.sayHello();


输出结果
============Hello World!

2、如果下面这种,输出就会正常
ApplicationContext ctx = new ClassPathXmlApplicationContext("file:src/aop/aop.xml");
HelloWoldService hello = (HelloWoldService) ctx.getBean("helloWorldService");
hello.sayHello();

输出结果
===========before advice
============Hello World!
===========after finally advice
31 楼 zhuguopei_java 2013-06-26  
jinnianshilongnian 写道
那就是classpath下没有那个类  你可以使用Class.forName 测试下 

tao哥,可以了,,,刚刚我改错地方了。   
30 楼 jinnianshilongnian 2013-06-26  
那就是classpath下没有那个类  你可以使用Class.forName 测试下 
29 楼 zhuguopei_java 2013-06-26  
jinnianshilongnian 写道
zhuguopei_java 写道

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'helloWorldService' defined in class path resource [helloworld.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': Cannot create inner bean '(inner bean)' of type [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Cannot create inner bean '(inner bean)' of type [org.springframework.aop.config.MethodLocatingFactoryBean] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Initialization of bean failed; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [spring.aop.HelloWorldAspect] for bean with name 'aspect' defined in class path resource [helloworld.xml]; nested exception is java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect
Related cause: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [spring.aop.HelloWorldAspect] for bean with name 'aspect' defined in class path resource [helloworld.xml]; nested exception is java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect
找了N长时间了,就是解决不了  




java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect

你仔细检查下这个类路径写没写错; 有木有在classpath下,


还是不行,,,,
28 楼 jinnianshilongnian 2013-06-26  
zhuguopei_java 写道

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'helloWorldService' defined in class path resource [helloworld.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': Cannot create inner bean '(inner bean)' of type [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Cannot create inner bean '(inner bean)' of type [org.springframework.aop.config.MethodLocatingFactoryBean] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Initialization of bean failed; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [spring.aop.HelloWorldAspect] for bean with name 'aspect' defined in class path resource [helloworld.xml]; nested exception is java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect
Related cause: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [spring.aop.HelloWorldAspect] for bean with name 'aspect' defined in class path resource [helloworld.xml]; nested exception is java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect
找了N长时间了,就是解决不了  




java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect

你仔细检查下这个类路径写没写错; 有木有在classpath下,
27 楼 zhuguopei_java 2013-06-26  

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'helloWorldService' defined in class path resource [helloworld.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': Cannot create inner bean '(inner bean)' of type [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Cannot create inner bean '(inner bean)' of type [org.springframework.aop.config.MethodLocatingFactoryBean] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Initialization of bean failed; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [spring.aop.HelloWorldAspect] for bean with name 'aspect' defined in class path resource [helloworld.xml]; nested exception is java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect
Related cause: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [spring.aop.HelloWorldAspect] for bean with name 'aspect' defined in class path resource [helloworld.xml]; nested exception is java.lang.ClassNotFoundException: spring.aop.HelloWorldAspect
找了N长时间了,就是解决不了  
26 楼 jinnianshilongnian 2013-06-23  
jzzwy 写道
sorriest-siben 写道
<aop:pointcut id="pointcut" expression="execution(* cn.javass..*.*(..))"/>
请问* cn.javass..*.*(..)这里,第一个星号和cn之间要空格,为什么呢?

这个问题和 int add(){} 方法 int和add之间如果没有空格还脚方法么 ,
表达式的第一个*代表任意有无返回值的方法

语法规则, 第一个* 代表任意返回值 如果不加空格 就无法和包名区分了
25 楼 jzzwy 2013-06-23  
sorriest-siben 写道
<aop:pointcut id="pointcut" expression="execution(* cn.javass..*.*(..))"/>
请问* cn.javass..*.*(..)这里,第一个星号和cn之间要空格,为什么呢?

这个问题和 int add(){} 方法 int和add之间如果没有空格还脚方法么 ,
表达式的第一个*代表任意有无返回值的方法
24 楼 sorriest-siben 2013-06-03  
<aop:pointcut id="pointcut" expression="execution(* cn.javass..*.*(..))"/>
请问* cn.javass..*.*(..)这里,第一个星号和cn之间要空格,为什么呢?
23 楼 alan0509 2013-04-14  
alan0509 写道
alan0509 写道
alan0509 写道
没有 出现 ===========after finally advice 这句 是为什么?


没有报任何异常  也没有打印最后一句话

<aop:after method="afterFinallyAdvice" pointcut="execution(* testspring.aop..*.sayHello(..))" />

这个是我的配置,不知道问题出在哪


这是我后续的配置 <aop:config>
<aop:pointcut expression="execution(* testspring.aop..*.sayHello(..))"
id="pointcut" />
<aop:aspect ref="aspect">
<aop:before method="beforeAdvice" pointcut-ref="pointcut" />
<!--  匿名切入点 -->
<!-- <aop:after method="afterFinallyAdvice" pointcut-ref="execution(* testspring.aop..*.*(..))"/> -->
<aop:after method="afterFinallyAdvice" pointcut="execution(* testspring.aop..*.sayHello(..))" />
<aop:after-returning method="afterFinallyAdvice" pointcut="execution(* testspring.aop..*.sayHello(..))"  />
<aop:around method="aroundAdvice" pointcut="execution(* testspring.aop..*.sayAround(..))" />
</aop:aspect>
</aop:config>

我发现除了<aop:before> 工作外 其它的都不工作。代码是拷贝文中的代码


解决了 还以为是配置问题。是pom.xml文件出错了,然后好像程序一直停留在了上一个正确执行的状态。所以 无论怎么修改 总是看不到效果。

相关推荐

Global site tag (gtag.js) - Google Analytics