不知道大家偶没有遇见这样的情况,在注入service服务层的时候用@Autowired注解它下面总是有一条黄色的波浪线,像这样
然后换成@Resource后,黄色波浪线消失了。
我问了公司的大佬说@Autowired注解是Spring的,@Resource是JDK的,这俩实际区别不大,介于强迫症让波浪线消失所以用了@Resource注解。然后昨天刷抖音看见了一个博主讲解了这两个注解的区别,所以记录一下。
环境构建首先我在这里定义了一个接口TestService,下面有一个hello()方法。
public interface TestService {
void hello();
}
然后两个实现类TestServiceImpl01和TestServiceImpl02都实现这个方法。
TestServiceImpl01
@Service
public class TestServiceImpl01 implements TestService {
@Override
public void hello() {
System.out.println("hello TestServiceImpl01");
}
}
TestServiceImpl02
@Service
public class TestServiceImpl02 implements TestService {
@Override
public void hello() {
System.out.println("hello TestServiceImpl02");
}
}
最后再注入接口,并调用方法,这里我们先通过@Resource注入
@SpringBootApplication
public class Applicatiion implements CommandLineRunner {
@Resource
private TestService testService;
public static void main(String[] args) {
SpringApplication.run(Applicatiion.class,args);
}
@Override
public void run(String... args) throws Exception {
testService.hello();
}
}
@Resource注解
@Resource注解默认通过名称注入,如名称无法找到,则通过类型注入
名称的话我们这里别名是testService,它找不到,然后就会通过类型去找,就会找到两个,TestServiceImpl01和TestServiceImpl02,所以我们运行的时候会报错
大致意思就是要求一个单一的bean,但是找到了两个。
如果想解决这个报错,第一种方式就是删除一个实现类,第二种方式就是在注入的时候改名称。
@Resource
private TestService testServiceImpl01;
相当于它按照名称去找,testServiceImpl01或者testServiceImpl02,具体实现就是看名称,这里可能有人会问我实现类名称不是TestServiceImpl01和TestServiceImpl02吗,其实在注入bean的时候会把首字母变成小写,所以能匹配到。
@Autowired注解默认是先通过类型注入,如果存在多个类型则通过名称注入
@SpringBootApplication
public class Applicatiion implements CommandLineRunner {
@Autowired
private TestService testService;
public static void main(String[] args) {
SpringApplication.run(Applicatiion.class,args);
}
@Override
public void run(String... args) throws Exception {
testService.hello();
}
}
运行也会报错
其实在注入的时候它也已经提示你了
我们可以通过之前的方法修改名称来解决这个问题。
也可以通过@Qualifier注解来指定用哪个bean。
@Autowired
@Qualifier("testServiceImpl01")
private TestService testService;
除此之外还可以通过@Primary来指定优先使用哪一个bean
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)