我正在努力更好地理解@Autowired annotations组件扫描,但到目前为止我找到的所有示例都使用了context.getBean(..)来获得至少一个Bean。< / p>
我还读到这样做被认为是不好的做法,但如果没有context.getBean(..)
我似乎无法找到任何关于如何做的信息。有人可以通过一个例子和信息告诉我如何做到这一点吗?
答案 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
,将其“加载”到BeanFactory
。 BeanFactory
触发一组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应用程序,那么您应该看到DispatcherServlet
个ContextLoaderListener
类。这些类将启动您的应用程序并根据配置加载所有内容。 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注释。