@Autowired和@Resource的区别

文章详细介绍了在Spring框架中,@Autowired和@Resource注解的区别,以及如何处理一个接口有多个实现类的情况。@Autowired基于类型自动装配,@Resource基于名称或类型。在处理多个实现类时,可以通过@Primary、@Qualifier或@Resource注解来指定默认实现或特定实现。此外,还展示了如何根据业务需求动态决定注入哪个实现类。

1. @Autowired和@Resource的区别

  1. @Aurowired是根据type来匹配;@Resource可以根据name和type来匹配,默认是name匹配
  2. @Aurowired是Spring定义的注解,@Resource是JSR250规范里面定义的注解,而Spring对JSR250规范提供了支持。
  3. @Autowired如果需要支持name匹配,就需要配合@Primary或者@Qualifier注解使用来实现

2. 一个接口多个实现类的处理

public interface FileService {

    void getFile();
}
@Slf4j
@Service
public class FileServiceAImpl implements FileService {

    @Override
    public void getFile() {
        log.info("调用fileServiceAImpl...");
    }
}
@Slf4j
@Service
public class FileServiceBImpl implements FileService {

    @Override
    public void getFile() {
        log.info("调用fileServiceBImpl...");
    }
}

2.1 注入时候报错情况

在这里插入图片描述

2.2 使用@Primary注解处理

@Primary表示主要的bean,当存在多个相同类型的Bean的时候,优先使用声明了@Primary的Bean

FileServiceAImpl 类添加@Primary注解:

@Slf4j
@Service
@Primary
public class FileServiceAImpl implements FileService {

    @Override
    public void getFile() {
        log.info("调用fileServiceAImpl...");
    }
}

在这里插入图片描述

2.3 使用@Qualifer注解处理

@Qualifer的作用类似于条件筛选,它可以根据Bean的名字找到需要装备的目标Bean

@Slf4j
@Service("fileServiceAImpl")
public class FileServiceAImpl implements FileService {

    @Override
    public void getFile() {
        log.info("调用fileServiceAImpl...");
    }
}
@Slf4j
@Service("fileServiceBImpl")
public class FileServiceBImpl implements FileService {

    @Override
    public void getFile() {
        log.info("调用fileServiceBImpl...");
    }
}
@Slf4j
@SpringBootTest
class FileServiceTest {

    @Autowired
    @Qualifier("fileServiceBImpl")
    private FileService fileService;

    @Test
    void getFile() {
        fileService.getFile();
    }

}

在这里插入图片描述

2.4 使用@Resource注解处理

  • 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
  • 如果指定了name,则按name后的名字去bean元素里查找有与之相等的name属性的bean,找不到则抛出异常。
  • 如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
  • 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Slf4j
@Service("fileServiceAImpl")
public class FileServiceAImpl implements FileService {

    @Override
    public void getFile() {
        log.info("调用fileServiceAImpl...");
    }
}
@Slf4j
@Service("fileServiceBImpl")
public class FileServiceBImpl implements FileService {

    @Override
    public void getFile() {
        log.info("调用fileServiceBImpl...");
    }
}

2.4.1 name

@Slf4j
@SpringBootTest
class FileServiceTest {

    @Resource(name="fileServiceBImpl")
    private FileService fileService;

    @Test
    void getFile() {
        fileService.getFile();
    }
}

在这里插入图片描述

2.4.2 type

@Slf4j
@SpringBootTest
class FileServiceTest {

    @Resource(type = FileServiceBImpl.class)
    private FileService fileService;

    @Test
    void getFile() {
        fileService.getFile();
    }
}

在这里插入图片描述

2.5 根据业务情况动态的决定注入哪个serviceImpl

使用 ApplicationContext的getBean()方法动态指定需要用到的bean

@Slf4j
@SpringBootTest
class FileServiceTest {

    @Autowired
    private ApplicationContext context;

    @Test
    void getFile() {
        FileService fileService = getFileService(0);
        fileService.getFile();
    }

    /**
     * 根据业务参数生成需要的bean
     * @param num 具体的业务参数
     * @return
     */
    private FileService getFileService(int num){
        FileService fileService;
        if(num==1){
            fileService = context.getBean("fileServiceBImpl",FileService.class);
        }else {
            fileService = context.getBean("fileServiceAImpl",FileService.class);
        }
        return fileService;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值