Java Spring:方法getBean(String…)如何基于输入字符串查找bean?
我有以下工作正常的代码:Java Spring:方法getBean(String…)如何基于输入字符串查找bean?,java,spring,spring-boot,Java,Spring,Spring Boot,我有以下工作正常的代码: @SpringBootApplication public class DiDemoApplication { public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(DiDemoApplication.class, args); MyController controller = (MyController)
@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”在两种情况下都不区分大小写) 当您使用扩展自
@Component
注释(@Controller
扩展自@Component
)的注释对任何类进行注释时,如果该类在组件扫描范围内,Spring会将其加载到其ApplicationContext中
Spring将加载该组件,并将其命名为与类名类似的名称,但采用驼峰式大小写(驼峰式大小写用于命名Java中的任何变量),因此在本例中,当您使用扩展自
@component
注释的注释注释任何类时,(@Controller
扩展自@Component
),如果该类属于组件扫描范围,Spring将把它加载到其ApplicationContext中
Spring将加载该组件,并将其命名为与类名类似的名称,但采用驼峰式大小写(驼峰式大小写用于命名Java中的任何变量),因此在本例中,myController
这是一种为您的应用程序预设的映射,因为您可以在如下配置中映射它:
<bean id="myClass" class="MyClass">...</bean>
。。。
这是因为ApplicationContext是SpringIoT的一部分,它代表了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>
public void setMyClass(MyClass MyClass){
this.myClass=myClass;
}
//配置
...
这是一种为您的应用程序预设的映射,因为您在如下配置中映射它:
<bean id="myClass" class="MyClass">...</bean>
。。。
这是因为ApplicationContext是SpringIoT的一部分,它代表了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>
public void setMyClass(MyClass MyClass){
this.myClass=myClass;
}
//配置
...
它会找到它,因为您没有指定显式名称,默认情况下,Spring将使用类名,但以小写字母开头,以创建您用@Controller、@Resource等注释的bean。有关详细信息,请参阅文档:
如果您将您的控制器命名为@Controller(@Controller(value=“myBean”),或者简单地命名为@Controller(“myBean”))当您从上下文获取bean时,需要使用该名称。它会找到它,因为您没有指定显式名称,默认情况下,Spring将使用类名,但以小写字母开头,以创建用@Controller、@Resource等注释的bean。有关详细信息,请参阅文档:
如果您将@Controller(@Controller(value=“myBean”)命名为@Controller(value=“myBean”),或者简单地将@Controller(“myBean”)命名为@Controller,那么当您从上下文获取bean时,您需要使用该名称。您键入得更快;-)您键入得更快;-)我试图使用@Controller(name=“myBean”),但出现了错误:“找不到符号名”哦,在没有名称部分的情况下尝试,可能是默认字段名的值(@Controller(value=“myBean”)?也应该与@Controller(“myBean”)一起使用(我面前没有运行的Java/Spring环境:(适用于值。谢谢。我尝试使用@Controller(name=“myBean”)时出现错误:“找不到符号名”哦,在没有名称部分的情况下尝试,可能是默认字段名的值(@Controller(value=“myBean”)?也应适用于@Controller(“myBean”)(我面前没有运行的Java/Spring环境:(对值有用。谢谢。我说的代码库没有配置文件。我说的代码库没有配置文件。