代码之家  ›  专栏  ›  技术社区  ›  CrazySynthax

Spring:方法getBean(String…)是如何实现的根据输入字符串查找bean?

  •  0
  • CrazySynthax  · 技术社区  · 7 年前

    我有以下代码可以很好地工作:

    @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");
    

    3 回复  |  直到 7 年前
        1
  •  2
  •   DC-OHIO Niklas    5 年前

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

    如果您命名您的@Controller(@Controller(value=“myBean”),或者简单地命名为@Controller(“myBean”),那么当您从上下文中获取bean时,您需要使用该名称。

        2
  •  2
  •   shazin    7 年前

    当您使用扩展自的注释注释任何类时 @Component 注释( @Controller 扩展自 @组件

    Spring将加载该组件,并将其命名为与类名类似的名称,但采用驼峰式大小写(驼峰式大小写用于命名Java中的任何变量),因此在本例中 myController .

        3
  •  1
  •   LenglBoy    7 年前

    <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>