我是使用Spring的新手,尤其是Spring AOP。
我想在创建用户时发送通知。
我有一个带有createUser方法的UserManager类。
在调用此方法后,我想发送通知。
以下是配置文件:
<bean id="userManager" class="event.UserManager" />
<bean id="notifier" class="event.ConsoleNotifier" />
<bean id="notifyAdvice" class="event.NotifierAdvice">
<property name="notifier" ref="notifier" />
</bean>
<bean id="observerPointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedName" value="createUser" />
</bean>
<bean id="notifierAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="notifyAdvice" />
<property name="pointcut" ref="observerPointcut" />
</bean>
最后是织布工
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
我想创建一个UserManager对象并调用createUser方法来检查它是否正常工作
User user = new User.....
UserManager um = (UserManager) context.getBean("userManager");
um.createUser(user);
我有一个强制转换异常:$ Proxy4无法强制转换为event.UserManager
我有点理解为什么我的问题是:
如何实例化UserManager对象以调用createUser方法?
答案 0 :(得分:0)
好的,在查看您的代码后,有两条建议。
1)如果可能的话,适应Spring 3.0+,它为面向方面编程提供了注释驱动功能。这将使您的生活比XML更容易。此外,概念明智无关紧要。您可以使用以下代码的摘录来解决您的问题。
2)以下是如何执行此操作的示例。
记住Spring AOP是基于代理的,这意味着Spring需要你的bean(需要一个建议)来实现一个接口。在运行时,将生成接口的代理实现,并嵌入建议代码。
找到以下代码:
public interface UserMgr{
public void createUser();
}
@Component
public class UserManager implements UserMgr{
public void createUser(){
do something...
}
}
@Aspect
@Component
public class UserAspect{
@Around("execution(public * com.*..*createUser(..))")
public Object aroundUserCreate(final ProceedingJoinPoint pjp) throws Throwable {
Object proceed = null;
try {
do some advice work here...
} finally {
do some work if required...
}
return proceed;
}
}
答案 1 :(得分:0)
如果您的UserManager
实现了一个接口,那么编程到接口:将getBean()
调用转发给该接口。
否则,请<property name="proxyTargetClass" value="true" />
使用DefaultAdvisorAutoProxyCreator
。
Spring总是recommended programming to interfaces,但是有些情况下,根本无法更改类来实现接口(例如遗留代码),因此可以选择代理类实例,而不是通过使用CGLIB库实现一个接口。 proxyTargetClass
告诉Spring使用CGLIB代理该类,而不是通过接口进行JDK代理,这是Spring中的默认行为。