使用注释创建时,默认情况下bean如何命名?

时间:2018-02-19 18:02:21

标签: spring annotations javabeans

我正在使用其他人编写的Spring java代码。我想引用一个由注释(字段classABC)创建的bean:

    <p>Select:</p>
    <input value="blue" type="button" />
    <input value="green" type="button" />
    
    <div id="here-appears-thecolourchosen"></div>

以下代码尝试按名称获取对ClassABC bean的引用,但不起作用:

@Component
public class ClassService
{
    @Autowired
    ClassABC classABC;

public interface ClassABC

@Repository
public class ClassABCImpl extends BaseABC implements ClassABC

但是,以下按类型引用此bean的代码可以正常工作:

ClassABC classABC = ApplicationContext.getBean("classABC");

因为第一个引用不起作用,我猜这个bean没有被命名为&#34; classABC&#34;。这个bean的名字是什么?

注意:没有配置xml引用此bean,因此我不认为bean名称是在xml中定义的。

2 个答案:

答案 0 :(得分:3)

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/AnnotationBeanNameGenerator.html

是注释的默认bean名称生成器,DefaultBeanNameGenerator定义的bean是@Bean

在这种情况下,我相信bean的名称将是classABCImpl,因为它是由类的短名称构建的。

从具体服务实施的例子来看, com.xyz.FooServiceImpl -> fooServiceImpl

就个人而言,如果您想要通过名称引用该bean,我并不喜欢使用默认命名。在这些情况下更好地明确。

答案 1 :(得分:2)

在上述Darren Forsythe的回答中,AnnotationBeanNameGenerator的实现可以产生两种bean名称。

如果从类名称派生的简称以两个大写字母开头,则简称将成为Bean名称。 否则,如果短名称的前两个字符之一是小写,则Bean名称将是短名称,第一个字符是小写。

示例: com.xyz.FooServiceImpl类名称导致FooServiceImpl的简称。由于前两个字符不是大写,因此Bean名称将变为-> fooServiceImpl。

但是,如果类名称为com.xyz.FOoServiceImpl导致缩写为FOoServiceImpl,则您的bean名称将保持为FOoServiceImpl,因为前两个字符为大写。

相似地,com.xyz.FOoServiceIMPL将导致Bean名称为FOoServiceIMPL。

Spring在创建Bean名称时仅查看短名称及其前两个字符。