为什么Spring ProxyFactoryBean隐式定义有效?

时间:2015-04-14 13:02:28

标签: java spring

我有以下定义:

<bean id="myInterceptor" class="info.fastpace.MyInterceptor"/>

<bean id="alikProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target" ref="myClass"/>
    <property name="interceptorNames">
        <list>
            <value>myInterceptor</value>
        </list>
    </property>
</bean>

我定义了2个类:MyInterceptorMyClass

奇怪的是,Spring知道在调用类MyClass(大写M)之前调用拦截器,即使类没有在commonContext.xml文件中配置。唯一的提示是代理bean定义中的myClass(小写m)。

删除alikProxy bean定义时,不会调用拦截器。

Spring如何知道使用未定义 MyClass参考来调用myClass的拦截器?

1 个答案:

答案 0 :(得分:1)

看起来您定义了一个类MyClass的bean,但没有明确地给它任何名称,因此Spring只根据类名myClass给它一个默认名称MyClass

<强>更新
我想在你的Spring上下文xml中你有<context:component-scan>元素。

以下是图书Spring In Action, 3rd Edition的一个片段:

  

默认情况下,<context:component-scan>查找用一个注释的类   一些特殊的刻板印象注释:

     
      
  • @Component - 表示该类的通用构造型注释   是一个Spring组件
  •   
     

...跳过...

     

例如,假设我们的应用程序上下文中只包含eddieguitar bean。我们可以使用<bean>并使用<context:component-scan>注释InstrumentalistGuitar类来消除XML配置中的显式@Component声明。

     

...跳过...

     

当Spring扫描com.springinaction.springidol包时,它会找到它   Guitar使用@Component进行注释,并会在Spring中自动注册。 默认情况下,bean的ID将由camel-casing类名生成。Guitar的情况下,这意味着bean ID将为guitar