如何在没有从aop:aspect引用的情况下实例化spring bean

时间:2011-11-29 15:48:57

标签: java spring

使用Spring和Java;

我有一个可行的切入点。现在我想从spring中删除切入点和AOP,只是用java代码中的事件触发事件,但我希望仍然通过Spring调用“myAdvice”bean及其属性集。

即使在java代码中,我想要摆脱所有的建议,没有更多的建议或任何AOP的痕迹,我已经有一个很好的事件系统工作。 我只想通过Spring实例化我的bean

当我删除第二个代码块(一个以“aop:config”开头)时,我注意到bean“myAdvice”不再被调用和实例化。我如何调用它设置其属性而不从“aop:aspect”引用它?

在我的应用程序上下文中;

<bean id="myAdvice" class="com.myclass">
    <property name="name1" ref="ref1" />
    <property name="name2" ref="ref2" />        
</bean>


<aop:config proxy-target-class="true">
    <aop:aspect id="myAspect" ref="myAdvice">
        <aop:pointcut id="myPointcut" expression="execution(* com.myexcmethod" />
        <aop:around pointcut-ref="myPointcut" method="invoke" />
    </aop:aspect>
</aop:config>

2 个答案:

答案 0 :(得分:0)

如果您希望能够获得bean本身,可以将其传递给此函数:

public static Object unwrapProxy(Object proxiedBean) throws Exception {
    while(proxiedBean instanceof Advised) {
        proxiedBean = ((Advised) proxiedBean).getTargetSource().getTarget();
    }

    return proxiedBean;
}

请注意,您需要拥有循环以确保您打开所有 AOP建议。

答案 1 :(得分:0)

您的配置看起来很好。当ApplicationContext加载时,您的bean应该被实例化为单例bean。也许你想检查一下你是否有一个default-lazy-init设置可以防止急切加载bean。