@Autowired 在方法参数中不起作用

Posted

技术标签:

【中文标题】@Autowired 在方法参数中不起作用【英文标题】:@Autowired doesn't work in method parameter 【发布时间】:2018-04-28 02:43:32 【问题描述】:

这是我的 AppConfig:

@Configuration
@EnableWebMvc
@ComponentScan
class AppConfig
    @Bean("myname")
    fun name(): Name = Name("Quang")

数据类:

data class Name(val value: String ="")

我的控制器类:

@Controller
@RequestMapping("/")
class Main
    @RequestMapping("/")
    @ResponseBody
    fun index(@Autowired @Qualifier("myname") name: Name): Name 
        //this return ""
        return name
    

结果是“”而不是“Quang”。 但是现在如果我像这样从字段中注入它,它可以正常工作:

@Controller
@RequestMapping("/")
class Main
    @Autowired(required = true)
    @Qualifier("myname")
    lateinit var name:Name
    @RequestMapping("/")
    @ResponseBody
    fun index(): Name 
        //this return "Quang" as expected
        return name
    

那么你能解释一下为什么我在方法参数中使用@Autowired 时不起作用

【问题讨论】:

这是一个处理方法。当您收到请求并且 Spring MVC 确定它应该由该方法处理时,它会被调用。 Spring MVC 不执行任何类型的@Autowired 注入。有许多受支持的参数类型(一些带有注释),这些类型都记录在规范中。 重读文档后,我意识到这真是一个愚蠢的问题:(。@Autowired 用于字段、构造函数和 setter 方法。 【参考方案1】:

根据文档:

将构造函数、字段、setter 方法或 config 方法标记为 由 Spring 的依赖注入工具自动装配。

在您的第一个示例中,Spring 不会自动装配任何东西。

【讨论】:

以上是关于@Autowired 在方法参数中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

多态性在 Java 中的方法参数中不起作用

Visual Studio 自定义代码片段在方法定义的参数列表中不起作用

为啥模板参数推导在 C++ 中不起作用?

为啥高度参数在标签小部件中不起作用?

激活参数在 GridSearch 中不起作用

env 参数在 system2 中不起作用?