- ObjectProvider接口
ObjectProvider接口可被解析于构造方法、set方法等,可替代@Autowired注解,并能够获取Bean数组,或者转为集合类型。
作用于构造方法与set方法
private Service service;
public S(ObjectProvider<Service> provider){
this.service = provider.getIfAvailable();
}
@Autowired
public void setProvice(ObjectProvider<Serive> provider){
this.service = provider.getIfAvailable();
}
可直接在形参位置声明为数组,这样可以获取容器中所有该类型的bean,此时如果调用getIfAvailable方法时有多个bean,则会抛出异常,这种方式在mybatis底层大量用到
@Autowired
public void setProvice(ObjectProvider<Serive[]> provider){
this.service = provider.getIfAvailable();
}
public MybatisPlusAutoConfiguration(MybatisPlusProperties properties, ObjectProvider<Interceptor[]> interceptorsProvider, ObjectProvider<TypeHandler[]> typeHandlersProvider, ObjectProvider<LanguageDriver[]> languageDriversProvider, ResourceLoader resourceLoader, ObjectProvider<DatabaseIdProvider> databaseIdProvider, ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider, ObjectProvider<List<MybatisPlusPropertiesCustomizer>> mybatisPlusPropertiesCustomizerProvider, ApplicationContext applicationContext) {
this.properties = properties;
this.interceptors = (Interceptor[])interceptorsProvider.getIfAvailable();
this.typeHandlers = (TypeHandler[])typeHandlersProvider.getIfAvailable();
this.languageDrivers = (LanguageDriver[])languageDriversProvider.getIfAvailable();
this.resourceLoader = resourceLoader;
this.databaseIdProvider = (DatabaseIdProvider)databaseIdProvider.getIfAvailable();
this.configurationCustomizers = (List)configurationCustomizersProvider.getIfAvailable();
this.mybatisPlusPropertiesCustomizers = (List)mybatisPlusPropertiesCustomizerProvider.getIfAvailable();
this.applicationContext = applicationContext;
}
也可以集合来收集
@Autowired
public void setProvice(ObjectProvider<Serive[]> provider){
System.out.println(provider.orderedStream().collect(Collectors.toList()));
}
在编写第三方框架时用这个特性是可以的。