我们在日常开发中,有时候会遇到需要使用接口实现多态的需求,那么在Spring中该如何实现呢?
Spring为我们提供了InitializingBean 接口,接口中的afterPropertiesSet()方法将在所有的属性被初始化后调用,但是会在init前调用。
下面我们先来看一下该接口的定义:
public interface InitializingBean {
/**
* Invoked by a BeanFactory after it has set all bean properties supplied
* (and satisfied BeanFactoryAware and ApplicationContextAware).
* <p>This method allows the bean instance to perform initialization only
* possible when all bean properties have been set and to throw an
* exception in the event of misconfiguration.
* @throws Exception in the event of misconfiguration (such
* as failure to set an essential property) or if initialization fails.
*/
void afterPropertiesSet() throws Exception;
}
想要实现接口的多态注入需要进行如下的步骤:
首先,定义一个接口类:
public interface IService {
Integer getType();
void print(String str);
}
然后写两个实现类实现IService接口,实现接口中的方法:
@Service
public class IServiceAImpl implements IService{
@Override
public Integer getType() {
return new Integer(1);
}
@Override
public void print(String str) {
System.out.preintln(str);
}
}
@Service
public class IServiceBImpl implements IService{
@Override
public Integer getType() {
return new Integer(2);
}
@Override
public void print(String str) {
System.out.preintln(str);
}
}
下面是核心的代码,实现路由功能:
@Component
public class ServiceRouter implements InitializingBean {
private static final Map<Integer, IService> routerMap = Maps.newHashMap();
@Autowired
private List<IService> iServiceList;
@Override
public void afterPropertiesSet() throws Exception {
for (IService service : iServiceList) {
routerMap.put(service.getType(), service);
}
}
public IService getService(Integer type) {
return routerMap.get(type);
}
}
写一个测试类:
@RestController
public class MyController {
@Autowired
private ServiceRouter router;
@RequestMapping("/test")
public void test(@RequestParam Integer type) {
IService service = router.getService(type);
service.print("hello world");
}
}
那么现在就可以根据传进来的type进行动态的调用实现类,实现多态了。是不是很简单。
由于本人水平有限,如有错误请大家多多包涵~
网友评论