使用面向方面的编程

时间:2014-06-05 12:37:24

标签: spring aop spring-aop

我是使用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方法?

2 个答案:

答案 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中的默认行为。