我有一个类似下面的控制器类:
@Controller
class X extends BaseController{
@RequestMapping()
public String getX(){
}
}
public class BaseController implements ServletContextAware {
}
我正在尝试添加如下所示的方面:
@Service
@Aspect
public class Foo{
@Around("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
public Object profileControllerAction(ProceedingJoinPoint pjp)
throws Throwable {
// do stuff
}
}
但是,不调用aspect方法。我希望在调用控制器的getX()
时执行它。
我看到spring mvc没有用代理包装我的控制器bean。这就是为什么这个方面没有效果的原因?
任何人都可以解释我如何获得所谓的方面。
控制器类位于: com.xyz.webapp.controller
Aspect类在 com.xyz.webapp
上下文文件位于WEB-INF中 上下文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"
xmlns:context="http://www.springframework.org/schema/context"
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-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
default-lazy-init="true">
<context:annotation-config/>
<context:component-scan base-package="com.xyz"/>
<aop:aspectj-autoproxy />
<aop:config>
<aop:advisor id="serivcesApiAdvice" advice-ref="serivcesAdvice" pointcut="execution(* *..provider.*.*(..))" order="1"/>
</aop:config>
<bean id="serivcesAdvice" class="com.xyz.webapp.spring.xyzMethodInterceptor"/>
</beans>
-----更多细节--- 我在我们的一个控制器方法中添加了以下代码。该列表包含所有控制器和我编写的方面。实际上,我认为它列出了我们所有的bean。如何在运行时查看应用程序中所有应用程序上下文的内容?
ApplicationContext context = ApplicationContextProvider.getApplicationContext();
System.out.println("context name:" + c.getDisplayName());
for(String s : context.getBeanDefinitionNames()){
System.out.println(s);
}
它打印的上下文名称是:Root WebApplicationContext
答案 0 :(得分:1)
上下文中的方面配置仅适用于该上下文。它只能处理那里声明的bean。
Spring在其根上下文和servlet上下文之间使用父子关系。因此,上述规则不适用。如果希望代理服务器代理其他方面行为,则需要将方面配置添加到servlet上下文中,该上下文扫描并生成@Controller
bean。
请注意,您似乎正在进行冗余配置。您(我假设)根上下文是扫描应由servlet上下文扫描的包(包含@Controller
类)。不要这样做,否则你最终会得到两个豆子或注射错误。
此外,
<context:annotation-config/>
如果指定,则是多余的
<context:component-scan base-package="com.xyz"/>
你可以摆脱它。