@AutoWired

Posted yaoyuan2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@AutoWired相关的知识,希望对你有一定的参考价值。

在springboot中启用了@SpringBootApplication注解,就能启用spring内建注解。包含@AutoWired。

@AutoWired可标记到

  • 属性
  • setter
  • 构造器

FooFormatter

@Component("fooFormatter")
public class FooFormatter {
    public String format() {
        return "foo";
    }
}

1、属性

@SpringBootTest
class AttrTests {
    @Autowired
    private FooFormatter fooFormatter;//可以将fooFormatter改成其他名字如:fooFormat,因为@AutoWired是byType的。
。。。
}

2、setter

@SpringBootTest
class SetterTests {
    private FooFormatter fooFormatter;
    @Autowired
    public void setFooFormatter(FooFormatter fooFormatter) {
        this.fooFormatter = fooFormatter;
    }
。。。
}

3、构造器

@SpringBootTest
class ConstructorTests {
    private FooFormatter fooFormatter;
    @Autowired
    public ConstructorTests(FooFormatter fooFormatter) {
        this.fooFormatter = fooFormatter;
    }
。。。
}

如果依赖的对象没有被注入,如

@SpringBootTest
class RequireTests {
    @Autowired
    private cn.hutool.core.lang.Dict dict;
    @Test
    void test() {
        if (dict == null) {
            System.out.println("空");
        }
    }

}

就会抛出异常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘cn.hutool.core.lang.Dict‘ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

因此,需要在@AutoWired后边的括号里加上required=false

@Autowired(required = false)
private Dict dict;

执行后,就不会抛出异常了。

但是,同一个接口有多个实现类时,如果在用@AutoWired就无法确认到底用的是哪个类了。解决方法是加上@Qualifier。见下一篇。

以上是关于@AutoWired的主要内容,如果未能解决你的问题,请参考以下文章

@Autowired用法与原理解析

Spring 梳理 - @Autowired VS @Resource

@autowired注解 怎么生效

@Autowired 注入为null

spring autowired怎么按照name注入

@Autowired注解(转)