使用注释创建的 bean 默认情况下如何命名?
How are beans named by default when created with annotation?
我正在使用 Spring java 其他人编写的代码。我想引用一个由注释创建的 bean(字段类 ABC):
@Component
public class ClassService
{
@Autowired
ClassABC classABC;
public interface ClassABC
@Repository
public class ClassABCImpl extends BaseABC implements ClassABC
以下代码尝试按名称获取对 ClassABC bean 的引用,但不起作用:
ClassABC classABC = ApplicationContext.getBean("classABC");
但是,以下按类型引用此 bean 的代码确实有效:
ClassABC classABC = ApplicationContext.getBean(ClassABC.class);
因为第一个引用不起作用,我猜测该 bean 没有命名 "classABC"。这个豆子叫什么名字?
注意:没有配置 xml 引用这个 bean,所以我认为 bean 名称没有在 xml 中定义。
是注解的默认bean名称生成器,@Bean
定义的bean有一个DefaultBeanNameGenerator
在这种情况下,我相信 bean 的名称将是 classABCImpl
,因为它是由 class 的短名称构建的。
从具体服务实现的例子来看,
com.xyz.FooServiceImpl -> fooServiceImpl
如果您想要通过名称引用该 bean,就我个人而言,我不喜欢使用默认命名。在这些情况下最好明确。
添加到上面 Darren Forsythe 的回答中,AnnotationBeanNameGenerator 的实现可以产生两种 bean 名称。
如果从 class 名称派生的短名称以两个大写字符开头,则短名称将成为 bean 名称。
否则,如果短名称的前两个字符之一是小写,bean 名称将是第一个字符小写的短名称。
示例:
com.xyz.FooServiceImpl class name 导致 FooServiceImpl 的简称。因为前两个字符不是大写,所以 bean 名称将变为 -> fooServiceImpl.
但是,如果 class 名称是 com.xyz.FOoServiceImpl,这导致了 FOoServiceImpl 的短名称,您的 bean 名称将保留为 FOoServiceImpl,因为前两个字符是大写的。
同样,com.xyz.FOoServiceIMPL,将导致 bean 名称为 FOoServiceIMPL。
Spring 在创建 bean 名称时只查看短名称及其前两个字符。
我正在使用 Spring java 其他人编写的代码。我想引用一个由注释创建的 bean(字段类 ABC):
@Component
public class ClassService
{
@Autowired
ClassABC classABC;
public interface ClassABC
@Repository
public class ClassABCImpl extends BaseABC implements ClassABC
以下代码尝试按名称获取对 ClassABC bean 的引用,但不起作用:
ClassABC classABC = ApplicationContext.getBean("classABC");
但是,以下按类型引用此 bean 的代码确实有效:
ClassABC classABC = ApplicationContext.getBean(ClassABC.class);
因为第一个引用不起作用,我猜测该 bean 没有命名 "classABC"。这个豆子叫什么名字?
注意:没有配置 xml 引用这个 bean,所以我认为 bean 名称没有在 xml 中定义。
是注解的默认bean名称生成器,@Bean
DefaultBeanNameGenerator
在这种情况下,我相信 bean 的名称将是 classABCImpl
,因为它是由 class 的短名称构建的。
从具体服务实现的例子来看,
com.xyz.FooServiceImpl -> fooServiceImpl
如果您想要通过名称引用该 bean,就我个人而言,我不喜欢使用默认命名。在这些情况下最好明确。
添加到上面 Darren Forsythe 的回答中,AnnotationBeanNameGenerator 的实现可以产生两种 bean 名称。
如果从 class 名称派生的短名称以两个大写字符开头,则短名称将成为 bean 名称。 否则,如果短名称的前两个字符之一是小写,bean 名称将是第一个字符小写的短名称。
示例: com.xyz.FooServiceImpl class name 导致 FooServiceImpl 的简称。因为前两个字符不是大写,所以 bean 名称将变为 -> fooServiceImpl.
但是,如果 class 名称是 com.xyz.FOoServiceImpl,这导致了 FOoServiceImpl 的短名称,您的 bean 名称将保留为 FOoServiceImpl,因为前两个字符是大写的。
同样,com.xyz.FOoServiceIMPL,将导致 bean 名称为 FOoServiceIMPL。
Spring 在创建 bean 名称时只查看短名称及其前两个字符。