没有id或名称的Spring bean

时间:2008-11-26 21:23:30

标签: spring

我正在查看一些Spring代码,我看到一些没有id或名称的bean defs。 做这件事的人不在乎。 该应用程序运行正常。 我不熟悉这必然意味着什么。 有人知道这是否意味着什么?

11 个答案:

答案 0 :(得分:23)

某些bean不需要由上下文文件中的其他bean访问,也不需要以编程方式访问。正如JacobM所提到的,他们不需要id或名称,因为他们没有被引用。

这样的示例是PropertyPlaceholderConfigurer,它读取属性文件,然后允许在上下文定义中替换运行时属性。

示例定义为

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="location" value="myapp.properties" />
</bean>

JavaDoc提供了有关此对象的更多文档,但在文件中,您可以通过使用标准模板替换占位符$ {...}来引用文件中的属性。

答案 1 :(得分:8)

一种可能性是您可以定义一个bean,因此您不需要id,因为您不需要从其他任何地方引用它。假设我有一个带有Bar属性的Foo对象:

<bean id="foo" class="Foo">
     <property name="bar">
         <bean class="Bar">
     </property>
</bean>

Bar bean不需要名称,因为它仅用于设置一个属性。

答案 2 :(得分:6)

检查自动接线的可能性。另一个bean可以通过将autowire属性设置为byType来引用未命名的bean。

这只是猜测。没有具体的例子,我不能再说了。

答案 3 :(得分:2)

id和name属性是可选的,用于从其他定义引用bean定义。请查看official Spring documentation以获取更多详细信息。

答案 4 :(得分:1)

仍然可以通过类名引用没有id或名称的Bean。 Spring使用类名自动命名这些bean,如果同一个类中有多个bean,则会向它们附加一个数字。 匿名bean通常在属性标记内定义,但如果它们只是在那里可能在其他bean中配置了自动装配。 无论如何,我认为在这些bean中添加名称或ID不会破坏您的应用程序。

答案 5 :(得分:1)

正如上面提到的几个人一样,并非所有的抓取都是基于名称/ ID;其中一些是基于类型。例如,有一个方法

BeanFactoryUtils.beansOfTypeIncludingAncestors(...)

抓取某些给定类型的所有bean。例如,Spring Web MVC DispatcherServlet(以及许多其他地方)使用它来按类型发现bean,例如HandlerMappings,HandlerAdapters,HandlerExceptionResolvers等等。将此与bean必须具有要找到的特定已知名称/ ID的情况(例如LocaleResolver(ID必须为“localeResolver”或将无法找到)和ThemeResolver(ID必须为“themeResolver”)或它不会被发现。)

答案 6 :(得分:1)

可以使用生成的ID(完整包名和类名)访问没有名称和ID定义的Bean,例如:

bean定义为

<bean class="pl.finsys.initOrder.TestBeanImpl">

可以通过

访问
TestBean bean = (TestBean) ctx.getBean("pl.finsys.initOrder.TestBeanImpl");

答案 7 :(得分:1)

//没有Bean id的Bean Cfg文件

<bean class="com.ds.DemoBean"> <property name="msg" value="Hello"/> </bean>

//我们可以访问

Object obj = factory.getBean(“com.ds.DemoBe

答案 8 :(得分:1)

看看上面说的https://docs.spring.io/spring/docs/4.3.12.RELEASE/spring-framework-reference/htmlsingle/#beans-beanname

  

您不需要提供bean的名称或ID。如果未明确提供名称或ID,则容器将为该bean生成一个唯一的名称。但是,如果要通过名称引用该bean,则必须通过使用ref元素或Service Locator样式查找,您必须提供一个名称。 不提供名称的动机与使用内部bean和自动装配协作者有关

此外,诸如BeanPostProcessor,BeanFactoryPostProcessor和PropertyPlaceholderConfigurer之类的Bean会被应用程序上下文自动检测到,并且通常没有名称

如果您考虑使用任何Spring bean,Spring会要求它具有一个标识符。如果您没有在配置中为bean提供任何标识符(通过id或name属性),则不会遇到异常。 Spring将通过分配默认标识符来解决这种情况。它具有BeanNameGenerator来分配默认名称。 <bean class="com.package.name.TestBean">将被命名为“ com.package.name.TestBean”。@Bean这种类型的bean将其方法名称称为bean名称

因此,由于某种原因,在您的代码中,您可以跳过命名几个bean的步骤,并且如果使用默认名称访问这些bean,代码仍然可以工作

信用:https://www.javacodegeeks.com/2013/02/spring-bean-names.html

答案 9 :(得分:0)

它不是强制提供java Bean Id。如果我们不提供Bean Id,我们的Container提供默认的Id.Default Bean Id看起来像 “(包名)。(Bean类名)#N”,其中N = 0,1,2,......等等。

答案 10 :(得分:0)

似乎未命名和命名的bean行为之间存在细微差别。如果您有两次导入的XML配置文件,则每个命名bean只会创建一次,但是在包含其定义的情况下,将创建一个未命名的bean。当尝试按类型自动装配这样的bean时,会导致如下错误:

No qualifying bean of type [your.class.Name] is defined: expected single matching bean but found 4