我有以下适用的代码:
@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'在两种情况下都不区分大小写)。
答案 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>