Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:方法getBean(String…)如何基于输入字符串查找bean?_Java_Spring_Spring Boot - Fatal编程技术网

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环境:(对值有用。谢谢。我说的代码库没有配置文件。我说的代码库没有配置文件。