公司一个酒店有多个供应商, 采用了设计模式,
接口是 HotelDataInterface , 4 个实现类.
使用 getHotelDataService(String code) 来得到对应的供应商的实现类.
/**
* 这是一个数据提供工厂负责提供数据的
* @version 1.0 2010-9-27
* @author ixr_wang(mail@ixr.name)
*/
@Controller
public class HotelDataFactory implements ApplicationContextAware{
/** 默认数据提供者 */
private static final String DEFALUT_CODE = HotelDataFactory.HotelServiceCodeFinal.WRRRR;
/** 服务商集合 */
private Map<String, HotelDataInterface> hotelDataMap = new HashMap<String, HotelDataInterface>();
/** 根据服务代码获取酒店服务商 */
public HotelDataInterface getHotelDataService(String code){
if(hotelDataMap.containsKey(code)){
return hotelDataMap.get(code);
}else{
return getDefalutHotelDataInterface();
}
}
/** 加载服务商 */
@PostConstruct
public void init(){
Map<?,?> hotelDataMap = context.getBeansOfType(HotelDataInterface.class);
for (Object item : hotelDataMap.values()) {
HotelDataInterface hotelDataItem = (HotelDataInterface) item;
this.hotelDataMap.put(hotelDataItem.getCode(), hotelDataItem);
}
}
/** 获取默认数据提供商 */
public HotelDataInterface getDefalutHotelDataInterface(){
return getHotelDataService(DEFALUT_CODE);
}
//
/** SPRING上下文 */
private ApplicationContext context = null;
/** 设置SPRING上下文 */
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
/** 供应商CODE定义 */
public static class HotelServiceCodeFinal{
/** XXX */
public static final String WRRRR = "wssss";
/**XXXX */
public static final String HSSSS1 = "110";
/** XXXX */
public static final String MCCCO = "311";
}
以上代码中,
实现了 ApplicationContextAware 接口, 这个接口提供了获得 BEAN 实例的 SPRING 上下文环境.
The ApplicationContext
beans
包提供了以编程的方式管理和操控bean的基本功能,而context
包下的 ApplicationContext
以一种更加面向框架的方式增强了BeanFactory
的功能。多数用户可以采用声明的方式来使用ApplicationContext
,甚至不用手动创建它,而通过ContextLoader
这样的支持类,把它作为J2EE web应用的一部分自动启动。当然,我们仍然可以采用编程的方式创建一个ApplicationContext。
context包的核心是ApplicationContext
接口。它由BeanFactory
接口派生而来,因而提供了BeanFactory
所有的功能。为了以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,context包还提供了以下的功能:
-
MessageSource
, 提供国际化的消息访问 -
资源访问 ,如URL和文件
-
事件传播 ,实现了
ApplicationListener
接口的bean -
载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
简单的说:除非你有更好的理由,否则尽量使用 ApplicationContext
,下面是对于哪些"为什么"等等更深入的建议
ApplicationContext
包含BeanFactory
的所有功能。通常建议比BeanFactory
优先,除非有一些限制的场合如字节长度对内存有很大的影响时(Applet
)。然后,绝大多数"典型的"企业应用和系统,ApplicationContext
就是你需要使用的。Spring2.0及以上版本,大量 使用了link linkend="beans-factory-extension-bpp">BeanPostProcessor
扩展(以便应用代理等功能),如果你选择BeanFactory
则无法使用相当多的支持功能,如事务和AOP,这可能会导致混乱,因为配置并没有错误。
在服务器启动时, 系统调用
/** 加载服务商 */
@PostConstruct
public void init()
@PostConstruct注解
@PostConstruct是Java EE 5引入的注解,Spring允许开发者在受管Bean中使用它。当DI容器实例化当前受管Bean时,@PostConstruct注解的方法会被自动触发,从而完成一些初始化工作。
初始化类 . 其中调用了Spring的
context.getBeansOfType(HotelDataInterface.class);
这个方法可以根据接口自动寻找所有的实现类,封装到MAP中 , key是类名, (XXXImpl), value是实现类。
接口中, 定义这个方法, getCode() 把相应的自己定义的 KEY 返回