網(wǎng)站建設(shè)與開發(fā)的收獲與體會信息流優(yōu)化
文章目錄
- 1. @Autowired和@Resource的區(qū)別
- 2. 一個接口多個實現(xiàn)類的處理
- 2.1 注入時候報錯情況
- 2.2 使用@Primary注解處理
- 2.3 使用@Qualifer注解處理
- 2.4 根據(jù)業(yè)務(wù)情況動態(tài)的決定注入哪個serviceImpl
1. @Autowired和@Resource的區(qū)別
- @Aurowired是根據(jù)type來匹配;@Resource可以根據(jù)name和type來匹配,默認是name匹配
- @Aurowired是Spring定義的注解,@Resource是JSR250規(guī)范里面定義的注解,而Spring對JSR250規(guī)范提供了支持。
- @Autowired如果需要支持name匹配,就需要配合@Primary或者@Qualifier注解使用來實現(xiàn)
2. 一個接口多個實現(xiàn)類的處理
public interface FileService {void getFile();
}
@Slf4j
@Service
public class FileServiceAImpl implements FileService {@Overridepublic void getFile() {log.info("調(diào)用fileServiceAImpl...");}
}
@Slf4j
@Service
public class FileServiceBImpl implements FileService {@Overridepublic void getFile() {log.info("調(diào)用fileServiceBImpl...");}
}
2.1 注入時候報錯情況
2.2 使用@Primary注解處理
@Primary表示主要的bean,當存在多個相同類型的Bean的時候,優(yōu)先使用聲明了@Primary的Bean
FileServiceAImpl 類添加@Primary注解:
@Slf4j
@Service
@Primary
public class FileServiceAImpl implements FileService {@Overridepublic void getFile() {log.info("調(diào)用fileServiceAImpl...");}
}
2.3 使用@Qualifer注解處理
@Qualifer的作用類似于條件篩選,它可以根據(jù)Bean的名字找到需要裝備的目標Bean
@Slf4j
@Service("fileServiceAImpl")
public class FileServiceAImpl implements FileService {@Overridepublic void getFile() {log.info("調(diào)用fileServiceAImpl...");}
}
@Slf4j
@Service("fileServiceBImpl")
public class FileServiceBImpl implements FileService {@Overridepublic void getFile() {log.info("調(diào)用fileServiceBImpl...");}
}
@Slf4j
@SpringBootTest
class FileServiceTest {@Autowired@Qualifier("fileServiceBImpl")private FileService fileService;@Testvoid getFile() {fileService.getFile();}}
2.4 根據(jù)業(yè)務(wù)情況動態(tài)的決定注入哪個serviceImpl
使用 ApplicationContext的getBean()方法動態(tài)指定需要用到的bean
@Slf4j
@SpringBootTest
class FileServiceTest {@Autowiredprivate ApplicationContext context;@Testvoid getFile() {FileService fileService = getFileService(0);fileService.getFile();}/*** 根據(jù)業(yè)務(wù)參數(shù)生成需要的bean* @param num 具體的業(yè)務(wù)參數(shù)* @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;}
}