我正在查看一些Spring代码,我看到一些没有id或名称的bean defs。 做这件事的人不在乎。 该应用程序运行正常。 我不熟悉这必然意味着什么。 有人知道这是否意味着什么?
答案 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)
您不需要提供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