【问题标题】:Can't find where @Resource object is instantiated in Spring xml找不到在 Spring xml 中实例化 @Resource 对象的位置
【发布时间】:2017-03-18 15:26:57
【问题描述】:

我试图找出一个 java 对象在哪里被实例化。我有一个 Spring 控制器,控制器中有一个 dataService 字段:

@SuppressWarnings("restriction")
@Controller
public class DataController {

   /**
    * Service for which to delegate retrieval of data
    */
    @Resource
    private DataService dataService;

(DataService是一个接口,实现这个服务的类是DataServiceImpl)。

据我了解,当字段上方有@Resource 时,表示该对象是使用通常在xml 文件中定义的spring bean 实例化的。但是,我已经在我的工作区中搜索了这个对象的名称(以及许多变体),并查看了项目中所有常见的 spring bean 位置,但我在任何地方都找不到任何提及。有谁知道这里会发生什么?

【问题讨论】:

    标签: java xml spring spring-mvc controller


    【解决方案1】:

    来自 spring 框架文档,

    @Resource 采用 name 属性,默认情况下 Spring 解释 该值作为要注入的 bean 名称。如果没有明确指定名称,则默认名称源自字段名称或 setter 方法。如果是字段,则采用字段名称;对于 setter 方法,它采用 bean 属性名称

    如果没有提供 name 属性,那么 spring 会退回到自动装配,它将搜索并注入匹配类型的 bean。所以 DataServiceImpl 可以在 spring bean xml 文件中定义或使用 @Component 进行注释。

    在没有明确名称的@Resource 使用的排他情况下 指定,并且类似于@Autowired,@Resource 查找主要类型 匹配而不是特定的命名 bean 并解析 wellknown 可解析的依赖关系。

    More on @Resource.

    【讨论】:

    • 是的,我在我的 spring beans 中搜索了 DataServiceImplDataService 之类的东西,但找不到任何东西。 DataServiceImpl 类看起来像这样,它确实有一个 @Service 注释,但即使我们有,我认为它需要一个 spring bean 定义? @Service public class DataServiceImpl implements DataService {
    • @Stackman 如果该类使用 @Service 注释,这是 @Component 的特化,那么 spring 将创建该类的 bean 并将其注入到它被引用的任何地方。在这种情况下,您不需要在 bean xml 文件中定义它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多