我的Aspect类将是,
@Configuration
@EnableAspectJAutoProxy
@Component
@Aspect
public class AspectClass {
@Before("execution(* com.pointel.aop.test1.AopTest.beforeAspect())")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before running the beforeAspect() in the AopTest.java class!");
System.out.println("Hijacked Method name : " + joinPoint.getSignature().getName());
System.out.println("************************");
}
}
我的其他java类
public class AopTest {
public void beforeAspect() {
System.out.println("This is beforeAspect() !");
}
}
我的主要课程是
public class MainMethod {
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("ApplicationContext/applicationContext.xml");
AopTest test = (AopTest)context.getBean("bean1");
test.beforeAspect();
}
}
我的applicationContext.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: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/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<bean id="bean1" class="com.pointel.aop.test1.AopTest" />
</beans>
在运行Main方法时,@Before("execution(* com.pointel.aop.test1.AopTest.beforeAspect())")
中AspectClass
中的beforeAspect()
将不会在AopTest
之前执行。
肯定赞赏好的答案。
答案 0 :(得分:4)
首先,如果您要使用基于注释的配置,请使用AnnotationConfigApplicationContext
代替FileSystemXmlApplicationContext
。并删除applicationContext.xml
文件,只需在配置类中添加@Bean
方法即可。像这样:
@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = "your.aspect.package")
public class AspectConfig {
@Bean
public AopTest aopTest() {
return new AopTest();
}
}
在你的主要
public class MainMethod {
public static void main(String[] args) {
AnnotationConfigApplicationContextcontext = new AnnotationConfigApplicationContext(AspectConfig.class);
// don't forget to refresh
context.refresh();
AopTest test = (AopTest)context.getBean("aopTest");
test.beforeAspect();
}
}
在AspectClass
中,您应该@Component
,@Aspect
,并且您的方法应该有@Before
之类的建议或切入点注释。它需要是@Component
,以便Spring知道扫描它。
答案 1 :(得分:1)
这里有些代码需要在xml中添加以使用注释 - 1.for @component注释。
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
2.之后使用组件扫描获取使用@component注释的所有带注释的bean类,并使用aop autoproxy -
<context:annotation-config/>
<context:component-scan base-package="mypackage"></context:component-scan>
<aop:aspectj-autoproxy>
</aop:aspectj-autoproxy>
答案 2 :(得分:0)
您缺少方面类中的切入点定义。
例如;
@Pointcut("execution(* *.advice(..))")
public void logBefore(){}
@Before("logBefore()")
public void beforeAdvicing(){
System.out.println("Listen Up!!!!");
}
首先,您必须明确自己的方方面面。您可以使用Point cuts来实现此目的。它是您在@Before注释中提供的切入点名称。有关详细信息@ http://dinukaroshan.blogspot.com/2010/06/aop-with-spring.html
,请查看我的博客文章答案 3 :(得分:0)
我没有在bean配置中看到你的AspectClass
。您还应该将其声明为Bean。