Spring:方法getBean(String ...)如何根据输入字符串找到bean?

时间:2017-10-10 12:02:55

标签: java spring spring-boot

我有以下适用的代码:

@SpringBootApplication
public class DiDemoApplication {

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(DiDemoApplication.class, args);
        MyController controller = (MyController) ctx.getBean("myController");
        controller.hello();
    }
}

@Controller
public class MyController {

    public String hello() {
        System.out.println("Hello World");
        return "foo";
    }
}

我删除了导入的声明。此代码运行并打印“Hello World”。

我的问题是关于这一行:

MyController controller = (MyController) ctx.getBean("myController");

我理解代码查找与字符串“myController”关联的控制器。但是,我没有看到类MyController如何链接到任何类型的这样的字符串。 Spring如何将类名MyController映射到字符串“myController”?它甚至不是同一个名字(字母'm'在两种情况下都不区分大小写)。

3 个答案:

答案 0 :(得分:2)

当您使用从@Component注释扩展的注释(@Controller@Component扩展)注释任何类时,如果该类属于组件扫描,则Spring会将其加载到其ApplicationContext范围。

Spring将加载该组件并将其命名为类名,但在Camel Casing中(Camel Casing用于命名Java中的任何变量),因此在这种情况下myController

答案 1 :(得分:1)

它会找到它,因为你没有指定一个显式名称,默认情况下Spring将使用类名,但以小写字母开头创建你用@ Controller,@ Resource等注释的bean。有关详细信息,请参阅文档 https://docs.spring.io/spring/docs/5.0.x/spring-framework-reference/core.html#beans-beanname

如果你命名@Controller(@ Controller(name =“myBean”)),你需要在从上下文中获取bean时使用该名称。

答案 2 :(得分:0)

这是为您的应用程序预设的一种映射,因为您将其映射到以下配置中:

<bean id="myClass" class="MyClass">...</bean>

它的工作原因是ApplicationContext是Spring-IoT的一部分,它代表了bean。它是一个容器,用于bean及其配置和命名是明确的。

请注意这样的调用,因为实现可以更改,但保持相同的名称,然后在运行时崩溃。 更安全的方式是一个类型安全的自己的setter:

public void setMyClass(MyClass myClass) {
   this.myClass = myClass;
}

// CONFIG
<bean id="myClass" class="MyClass">...</bean>
<bean id="myOtherClass" class="MyOtherClass">
   <property name="myClass" ref="myClass"/>
</bean>