【发布时间】:2014-12-08 16:14:11
【问题描述】:
您能否列出getBean 的所有可能来源?
顺便说一句,如果我只写context.getBean(SomeInterface.class),我能得到接口类的实现吗?
【问题讨论】:
标签: java spring dependency-injection aop
您能否列出getBean 的所有可能来源?
顺便说一句,如果我只写context.getBean(SomeInterface.class),我能得到接口类的实现吗?
【问题讨论】:
标签: java spring dependency-injection aop
它们来自 Spring 应用程序上下文(您在上面调用 getBean 方法)。
Spring 有一个应用上下文的概念,它是一个对象,包含诸如 Spring 管理的所有 bean 之类的东西。
您可以通过在 Spring XML 配置文件中配置 bean 或使用 @Component、@Service 等注释对类进行注释,然后让 Spring 通过扫描这些类的包来找到它们,从而将 bean 放入应用程序上下文中。
如果你写了context.getBean(SomeInterface.class),并且有一个实现了该接口的Spring bean,那么该方法调用将返回实现该接口的bean。
这些是 Spring 框架的基本概念。有关其工作原理的详细说明,请参阅 Spring 文档中的 chapter 5, The IoC Container。
【讨论】:
如果你进入ApplicationContext类层次,你会发现所有spring Application Context文件都是org.springframework.core.io.DefaultResourceLoader类的子类。
DefaultResourceLoader 的作用是获取当前线程上下文类加载器(如果没有提供)。所以我们可以理解,所有的应用上下文文件首先加载定义的类。 Application Context 加载 xml 文件中定义的所有 bean,使用 @Bean 注释或其他可用的 spring 注释进行标记。一旦上下文通过注解和/或 xml 扫描并在类加载器中加载所有 bean。上下文首先创建依赖并注入依赖。
要获取 context.getBean(SomeInterface.class),请参考以下文档。
根据我对文档的理解,如果定义了一个实现 bean 类,您将获得该 bean。
【讨论】: