【问题标题】:Spring without getBean(..)没有 getBean(..) 的 Spring
【发布时间】:2016-02-05 09:18:23
【问题描述】:

我试图更好地理解@Autowired 注释组件扫描,但到目前为止我发现的所有示例都在某些时候使用 context.getBean(..) 来获取至少一个 Bean。

我还读到这样做被认为是不好的做法,但我似乎找不到任何关于如何在没有 context.getBean(..) 的情况下执行此操作的信息

有人可以通过示例和信息告诉我如何做到这一点吗?

【问题讨论】:

  • 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题不属于 Stack Overflow 的主题

标签: java spring javabeans autowired


【解决方案1】:

在xml中定义你的bean并使用

 <context:component-scan base-package="com" />
 <mvc:annotation-driven />

豆定义

<bean id="processEngine" class="com.processEngine">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>

现在你可以得到如下的bean

@Autowired
private ProcessEngine processEngine;

【讨论】:

    【解决方案2】:

    工作原理

    spring 从 xml 或 java 配置中扫描 bean 的配方。然后spring创建一个beanDefinitions,它被“加载”到BeanFactory中。 BeanFactory 触发一组BeanPostProcessors (BPP),它们正在扫描特定注释的类,例如Autowired/Resource/PostProcessor 等,并执行适当的操作。如果您的类包含 @Autowired 注释,AutowiredAnnotationBeanPostProcessor 将自动连接必填字段(依赖项),并且当对象创建完成并且所有 BPP 都已解决时,从此时开始,对象已准备好供应用使用您的代码可以从容器中获取“就绪”对象。

    在某些情况下,您需要从不受 Spring 控制且不受容器管理的代码中访问此 bean。为此,您需要获取ApplicationContext(容器)并调用#getBean,指定名称或类型。直接使用applicationContext 不是一个好习惯,因为您可能会遇到一些问题,f.ex。 bean 的 id 可能会更改,如果您通过 id 引用 bean,则会抛出 NPE

    配置

    有几种方法可以配置 spring 来扫描类以查找 bean 配方。一个是定义component-scan,在这种情况下,这些类位于您设置的路径中,并具有任何有效的弹簧注释,如@Component@Service@Repository@Controller(用于 Web 容器) 将被考虑。另一种方法是使用&lt;bean&gt;@Bean 分别指定每个bean。

    示例。 如果你想创建一个 Web 应用程序,那么你应该看到 DispatcherServletContextLoaderListener 类。此类将启动您的应用程序并根据配置加载所有内容。前任here, 但是如果你想创建一个桌面应用程序,那么你最终会得到类似this

    【讨论】:

      【解决方案3】:

      有时(通常在不使用 Spring Boot 时),我会使用类似以下代码的内容:

      public static <T> T autowire(ApplicationContext ctx, T bean) {
          ctx.getAutowireCapableBeanFactory().autowireBean(bean);
          return bean;
      }
      

      在我的 main 中,我创建了一个主应用程序类的实例,其中包含一些 @Autowired 注释,用于我的 Spring 应用程序的主要服务/入口点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-24
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        相关资源
        最近更新 更多