梦丶亦丶云
需要导入,aop和aspect的jar包;
如果你是基于maven的项目,直接在pom.xml文件中添加:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.1.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.1.9.RELEASE</version> </dependency>
。ok
JaminHuang
在xml配置中,实现接口,会默认配置 一个实现类
惜1218
最好是在test/中按照类的包名,新建同样的包,然后创建测试类
远远sky
spring一般用的jar是:
spring-core:框架的核心工具类,其他组件都用到这个包,核心,你懂的
spring-beans:是用来访问配置文件和管理Bean进行IOC或DI操作的所有类
spring-aop:为aop提供实现包
spring-context:你在xml文件中要写<context>就要用到这个,他是提供IOC的功能上的服务,和许多企业级服务的支持
spring-aspects:提供对AspectJ的支持,以便可以方便的将面向方面的功能集成进IDE中,比如Eclipse AJDT。
spring-expression:提供了Spring表达式语言
spring-jdbc,aoplliance:aop联盟提供的规范包
慕桂英2211268
Pointcut is not well-formed: expecting 'name pattern' 它要求的名字格式就是要这样,不然就会类型转换异常
java.lang.IllegalArgumentException
萌呆呆
aop执行方式为:前置通知==>所要增强的方法==>后置通知==>最终通知
在出现异常时会进行:前置通知==>所要增强的方法==>异常通知==>最终通知
此时的后置通知不会显示而显示异常通知.
而用xml进行配置时,是按照我们写好的顺序进行动态组合完成,最终和后置通知是随着xml配置的前后顺序改变的,但是经过测试不会影响前置和所要增强的方法的顺序,但是会影响最终和后置通知的位置.
我认为利用环绕通知进行方法的增强(aop:around)是一个比较好的方式,不会出现顺序问题.
还有就是,关于这个aop方法增强的应用就我现在所认知大多还是为了事务服务,所以通过配置 事务管理和事务注解支持
<!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 开启事务控制的注解支持 --> <tx:annotation-driven transaction-manager="transactionManager"/>
将事务放入spring ioc容器中就可以解决数据的一致性和完整性问题.
孤僻成瘾
写的挺好的,理解感觉也挺生动。
定义了一个方面,每个方面会有若干点,每个点都可以设置在什么时候触发这个点开始工作,分别可以设置在这个点发生的事件之前、之后、返回前、抛出异常之前。同时也设置了各个方法,一点触发就到对应的方法中执行相应的操作。
总体感觉大概就是这个意思。
炉火_纯青
aspectjrt 也引入看看呢
慕粉1473922411
切面配置
花开彼岸天o
仙子狗尾巴草
仙子狗尾巴草
你要把错误代码贴上来瞧瞧
qq_小树_6
jar包没有导入,可以看看我的问答里的办法
慕哥4453691
这要看你的注解使用的方式,分几种情况:1、注解放置类上,则为类名首字母小写;2、注解放置在方法上,则为方法名称;3、通过注解的value参数设定名称,如@Bean(value="customBeanName")。
Serena_Cecilia
自己试了一下,把pointcut直接写到aop before的标签中,

且*与包名前面要有空格,否则也报错
这样是可以的,但是单独写pointcut的标签再写aop before的标签,就会报空指针的错
error:
Pointcut is not well-formed: expecting '(' at character position 0
serenaPointcut
请问一下大家,谢谢啦!
慕沐7199068
我下了你这个版本的jar包
果然没有那个类:)

火_柴
你好,怎么解决的呀
qq_怀念_10
bean用的是老师源代码的
<bean id="injectionService" class="com.imooc.ioc.injection.service.InjectionServiceImpl">
<constructor-arg name="injectionDAO" ref="injectionDAO"></constructor-arg>
</bean>
<bean id="injectionDAO" class="com.imooc.ioc.injection.dao.InjectionDAOImpl"></bean>
然后用junit跑testCons方法,报错如下
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'injectionService' defined in class path resource [spring-injection.xml]: Unsatisfied dependency expressed through constructor argument with index 0 of type [com.imooc.ioc.injection.dao.InjectionDAO]: Ambiguous constructor argument types - did you specify the correct bean references as constructor arguments?
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:733)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1114)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1017)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
at com.imooc.test.base.UnitTestBase.before(UnitTestBase.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
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.RunBefores.evaluate(RunBefores.java:27)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
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:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:539)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:761)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:461)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:207)
街边七号
哦 我傻了 XML中有配置Bean
小凡仔
你的bean上面声明了@component之类的注解、然后在xml又配置了一次,所以生成了两个切面代理。
慕丝1005885
看看你的构造器怎么写的。。
_________________h
这个老师讲的比较快,不适合0基础学习,他只是讲了一下大概的知识点,没有深入去讲,我是,看20分钟视频,自己花两个小时去查资料,敲代码,去理解的
qq_较劲_0
包导入的太多会导致tomcat负载大,这里只需要将有用的包导入即可,以后需要用到再来导入。
qq_较劲_0
刚刚学过,看不出来明显问题。。。知道大概是获取bean的时候出错了,你检查下xml配置文件,还有你的aopalliance-1.0.jar和aspectj-1.8.10.jar,还有aspectjweaver-1.5.3.jar导入了么?我之前是没有导入,老师也没有提醒。。。
qq_较劲_0
\\s表示 空格,回车,换行等空白符,我觉得应该是通过spilt把文件分开读入吧,不确定
locker
afterreturning和afterThrowing也执行了两次
只有biz是执行一次的。
qq_RememberU_0
可能是xml文件写错了吧?注意bean的首字母要小写
慕无忌4481884
芝麻馅的汉堡3374936
然后如果after-return配置在after前面,是先输出after-return方法,这什么什么梗?!
qq_幸福客_0
java运行时异常,你仔细查查自己写异常抛出的那段代码段