DSi*_*kin 2 spring annotations javabeans
我正在使用别人编写的Spring Java代码。我想引用由注释(字段classABC)创建的bean:
@Component
public class ClassService
{
@Autowired
ClassABC classABC;
public interface ClassABC
@Repository
public class ClassABCImpl extends BaseABC implements ClassABC
Run Code Online (Sandbox Code Playgroud)
以下代码尝试按名称获取对ClassABC bean的引用,但不起作用:
ClassABC classABC = ApplicationContext.getBean("classABC");
Run Code Online (Sandbox Code Playgroud)
但是,以下按类型引用此bean的代码确实起作用:
ClassABC classABC = ApplicationContext.getBean(ClassABC.class);
Run Code Online (Sandbox Code Playgroud)
因为第一个引用不起作用,所以我猜该bean没有命名为“ classABC”。这个豆叫什么名字?
注意:没有配置XML引用此bean,因此我认为bean名称不在xml中定义。
小智 10
添加到上面 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 名称时只查看短名称及其前两个字符。
是注释的默认bean名称生成器,有一个DefaultBeanNameGenerator用于定义的bean@Bean
在这种情况下,我相信Bean的名称为classABCImpl,因为它是由类的短名称构建的。
以具体的服务实现为例,
com.xyz.FooServiceImpl -> fooServiceImpl
就个人而言,如果您想通过名称引用该bean,我不喜欢使用默认命名。在这些情况下最好明确。
| 归档时间: |
|
| 查看次数: |
7248 次 |
| 最近记录: |