没有getBean的Spring(..)

时间:2016-02-05 09:18:23

标签: java spring javabeans autowired

我正在努力更好地理解@Autowired annotations组件扫描,但到目前为止我找到的所有示例都使用了context.getBean(..)来获得至少一个Bean。< / p>

我还读到这样做被认为是不好的做法,但如果没有context.getBean(..)

我似乎无法找到任何关于如何做的信息。

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

3 个答案:

答案 0 :(得分:1)

在xml中定义bean并使用

@Override
void method(int i)
{
    System.out.println("Int");
} 

Bean def

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

现在你可以得到如下的bean

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

答案 1 :(得分:0)

如何运作

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

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

<强>构造

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

<强>实施例 如果您想创建一个Web应用程序,那么您应该看到DispatcherServletContextLoaderListener类。这些类将启动您的应用程序并根据配置加载所有内容。 f.ex. here, 但是如果你想创建一个桌面应用程序,那么你最终会得到像this

这样的东西

答案 2 :(得分:-1)

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

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

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