Java 没有getBean的Spring(…)

Java 没有getBean的Spring(…),java,spring,javabeans,autowired,Java,Spring,Javabeans,Autowired,我试图更好地理解@Autowired annotations组件扫描,但到目前为止,我找到的所有示例都使用context.getBean(..)从某个点开始至少获取一个Bean 我还读到这样做被认为是不好的做法,但我似乎找不到任何关于如何在没有上下文的情况下这样做的信息 有没有人能给我一个例子和如何做到这一点的信息?有时(通常在不使用Spring Boot时),我会使用以下代码: public static <T> T autowire(ApplicationContext ctx,

我试图更好地理解@Autowired annotations组件扫描,但到目前为止,我找到的所有示例都使用context.getBean(..)从某个点开始至少获取一个Bean

我还读到这样做被认为是不好的做法,但我似乎找不到任何关于如何在没有上下文的情况下这样做的信息

有没有人能给我一个例子和如何做到这一点的信息?

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

public static <T> T autowire(ApplicationContext ctx, T bean) {
    ctx.getAutowireCapableBeanFactory().autowireBean(bean);
    return bean;
}
公共静态T autowire(ApplicationContext ctx,T bean){ getAutowireCapableBeanFactory().autowireBean(bean); 返回豆; } 在我的
main
中,我创建了一个主应用程序类的实例,其中包含一些@Autowired注释,用于Spring应用程序的主要服务/入口点。

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

public static <T> T autowire(ApplicationContext ctx, T bean) {
    ctx.getAutowireCapableBeanFactory().autowireBean(bean);
    return bean;
}
公共静态T autowire(ApplicationContext ctx,T bean){ getAutowireCapableBeanFactory().autowireBean(bean); 返回豆; }
在我的
main
中,我创建了一个主应用程序类的实例,其中包含一些@Autowired注释,用于Spring应用程序的主要服务/入口点。

用xml定义bean并使用

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

用xml定义bean并使用

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

它的工作原理

spring从xml或java配置扫描bean的配方。然后spring创建一个
beanDefinitions
,并将其“加载”到
BeanFactory
BeanFactory
触发一组
BeanPostProcessor
(BPP),它们正在扫描类以查找特定的注释,如
自动连接的
/
资源
/
后处理器
等,并执行适当的操作。如果您的类包含
@Autowired
注释,
AutowiredNotationBeanPostProcessor
将自动关联所需字段(依赖项),并且当对象创建完成且所有BPP都已计算完毕时,对象已准备好供应用程序使用,从这一点上,您的代码可以从容器中获取“就绪”对象

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

配置

有几种方法可以配置spring来扫描类以查找bean食谱。一种是定义
组件扫描
,在这种情况下,将考虑位于您设置的路径中并具有任何有效spring注释的类,如
@component
@Service
@Repository
@Controller
(用于web容器)。另一种方法是使用
@bean
分别指定每个bean

示例。 如果您想创建一个web应用程序,那么您应该使用
ContextLoaderListener
类查看
DispatcherServlet
。这些类将引导您的应用程序并根据配置加载所有内容。f、 例如,
但是如果你想创建一个桌面应用程序,那么你最终会得到类似于它如何工作的东西

spring从xml或java配置扫描bean的配方。然后spring创建一个
beanDefinitions
,并将其“加载”到
BeanFactory
BeanFactory
触发一组
BeanPostProcessor
(BPP),它们正在扫描类以查找特定的注释,如
自动连接的
/
资源
/
后处理器
等,并执行适当的操作。如果您的类包含
@Autowired
注释,
AutowiredNotationBeanPostProcessor
将自动关联所需字段(依赖项),并且当对象创建完成且所有BPP都已计算完毕时,对象已准备好供应用程序使用,从这一点上,您的代码可以从容器中获取“就绪”对象

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

配置

有几种方法可以配置spring来扫描类以查找bean食谱。一种是定义
组件扫描
,在这种情况下,将考虑位于您设置的路径中并具有任何有效spring注释的类,如
@component
@Service
@Repository
@Controller
(用于web容器)。另一种方法是使用
@bean
分别指定每个bean

示例。 如果您想创建一个web应用程序,那么您应该使用
ContextLoaderListener
类查看
DispatcherServlet
。这些类将引导您的应用程序并根据配置加载所有内容。f、 例如,
但是如果你想创建一个桌面应用程序,那么你最终会遇到类似

的问题,要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源