【问题标题】:Explicitly inject a bean marked @Component显式注入标记为 @Component 的 bean
【发布时间】:2012-09-21 16:49:22
【问题描述】:

因此,出于某种原因,我们项目的一半 bean 用 @Component 标记并注入到使用 @Autowired 注释标记为 @Component 的其他对象中,而另一半用 appliciationContext.xml bean 声明和具有 ref beans 值的属性显式连接.

问题是,在那些 xml bean 声明中,我可以注入标记为 @Component 的对象之一吗?如果是,它的 bean 引用名称是什么?

例如;

有些类是这样注释的;

@Component
public class BeanAImpl{ ... }

然后在 applicationContext.xml 中其他类被显式连接,因为它们没有注释;

<bean id="beanB" class="com.myapp.BeanBImpl"></bean>

我可以在 applicationContext.xml 中注入这两种“类型”的 bean 吗?

<bean id="beanUser" class="com.myapp.BeanUserImpl">
    <property name="beanA">HOW_TO_GET_REF_TO_BEANA?</property>
    <property name="beanB"><ref bean="beanB"/></property>
</bean>

【问题讨论】:

    标签: java spring


    【解决方案1】:

    BeanAImpl 类型的 BeanAImpl 的默认名称是 beanAImpl,您可以像手动声明的 bean 一样在 XML 中使用它(另请注意,&lt;property&gt; 允许更短的语法):

    <property name="beanA" ref = "beanAImpl" />
    

    或者,您可以将名称显式设置为@Component("beanA")

    【讨论】:

      【解决方案2】:

      这是 Spring 所说的:

      当一个组件作为扫描过程的一部分被自动检测时,它的 bean 名称将由该扫描器已知的 BeanNameGenerator 策略生成。 如果您不想依赖默认的 bean 命名策略,您可以提供自定义 bean 命名策略。首先,实现 BeanNameGenerator 接口,并确保包含一个默认的无参数构造函数。然后,在配置扫描器时提供完全限定的类名:

       <context:component-scan base-package="org.example"
                               name-generator="org.example.MyNameGenerator" />
      

      默认实现就是类名以loer大小写开头。

      【讨论】:

        【解决方案3】:

        我认为你想使用@Resource(name="your_id_here") 而不是@Component,然后你可以像使用beanB 一样使用&lt;ref&gt;。试一试。

        来源:http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s11.html#beans-resource-annotation

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-31
          • 2022-12-19
          • 2014-10-12
          • 1970-01-01
          • 2013-05-10
          • 1970-01-01
          • 2019-01-08
          • 1970-01-01
          相关资源
          最近更新 更多