我从Spring的书中采用了这个例子,它应该在静态aspectOf()方法的帮助下创建方面“СriticAspect”的实例,但是在配置CriticAspect时我得到“无法解析属性”critismEngine“错误在xml中,虽然在CriticAspect类中有这样的属性。
XML配置文件如下所示:
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="concert"/>
<context:load-time-weaver/>
<aop:aspectj-autoproxy/>
<bean class="concert.Audience"/>
<bean id="show" class="concert.Show" ><aop:scoped-proxy /></bean>
<bean id="criticismEngine"
class="concert.CriticismEngineImpl">
<property name="criticismPool">
<list>
<value>Worst performance ever</value>
<value>I laughed, I cried</value>
<value>A must see show!</value>
</list>
</property>
</bean>
<bean class="concert.CriticAspect"
factory-method="aspectOf" >
<property name="criticismEngine" ref="criticismEngine" />
</bean>
</beans>
Aspect CriticAspect看起来像:
package concert;
public aspect CriticAspect {
private CriticismEngine criticismEngine;
public CriticAspect(){}
pointcut performance() : execution(* perform(..));
after()returning: performance(){
System.out.println(criticismEngine.getCriticism());
}
public void setCriticismEngine(CriticismEngine criticismEngine){
this.criticismEngine=criticismEngine;
}
}
答案 0 :(得分:0)
就像我在my answer to a similar question中所说的那样甚至是同一本书中的相同代码片段:
我认为您需要决定是否使用
@IBAction func LetterOneButtonPressed(sender: UIButton) {
//you can actually omit the switch statement in your case
labels[index].text = letters[sender.tag]
index += 1
}
或<aop:aspectj-autoproxy/>
,但不是两者在一起。您使用原生AspectJ语法,因此显然您想使用第二个选项。如果从XML配置中删除autoproxy语句,请尝试查看会发生什么。
请注意,为了编译原生AspectJ代码,您需要使用AspectJ编译器 ajc ,而不仅仅是 javac 。
答案 1 :(得分:0)
与@kriegaex一样,您的方面具有纯Foo
语法,在这种情况下,您必须使用AspectJ
来编译此方面代码。如果你这样做,并且使用ajc
编译所有代码,那么在Spring上下文中不需要额外的AOP配置,AspectJ将完成所有工作。在字节码级别的编译时,类将与您的方面编织在一起。
因此,如果您决定使用此方法,则必须执行以下操作(以下示例使用Maven构建):
首先确保您的方面代码位于正确的位置ajc
第二次在src/main/aspectj/CriticAspect.aj;
AspectJ
运行时和编译器
pom.xml
第三现在,您可以在 Spring应用程序上下文中定义您的方面,就像启用依赖项注入一样。您的Spring XML配置文件必须如下所示
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>${aspectj.plugin.version}</version>
<configuration>
<showWeaveInfo>true</showWeaveInfo>
<source>${java.source}</source>
<target>${java.target}</target>
<complianceLevel>${java.target}</complianceLevel>
<encoding>UTF-8</encoding>
<verbose>false</verbose>
<XnoInline>false</XnoInline>
</configuration>
<executions>
<execution>
<id>aspectj-compile</id>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>aspectj-compile-test</id>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
注意,在这种情况下,您必须从<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="concert"/>
<bean class="concert.Audience"/>
<bean id="show" class="concert.Show"/>
<bean id="criticismEngine"
class="concert.CriticismEngineImpl">
<property name="criticismPool">
<list>
<value>Worst performance ever</value>
<value>I laughed, I cried</value>
<value>A must see show!</value>
</list>
</property>
</bean>
<bean class="concert.CriticAspect"
factory-method="aspectOf" >
<property name="criticismEngine" ref="criticismEngine" />
</bean>
</beans>
或任何其他Spring配置中删除<context:load-time-weaver/>
和<aop:aspectj-autoproxy/>
。