之前有过Spring获得管理对象的几种实用方法(http://javacui.com/framework/36.html ),还是再简单独说明下。
通过实现ApplicationContextAware接口来实现,该接口需要标记为实体,所以要增加@Component属性,让Spring注解来生成该对象。
package com.utils; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * @说明 获得Spring容器内的对象 */ @Component public class SpringFactory implements ApplicationContextAware { private static ApplicationContext context; @SuppressWarnings("static-access") public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.context = applicationContext; } /** * 根据 ID 获得某个Spring容器对象 * @param id 对象ID * @return Spring容器中的对象 */ public synchronized static Object getObject(String id) { Object object = null; object = context.getBean(id); return object; } }
同时注意,必须去掉Spring的延迟加载,否则要等实体用时再创建,获取Bean的这个方法会获取到空的对象。
所以取消applicationContext.xml的default-lazy-init="true"属性。
注解和XML配置不同的时,XML时我们的Bean都是自己命名的,这里根本不知道Bean的名字。
Spring是根据标准Java规范,将Bean名称的首字母小写来命名的。
所以你可以这样来获取一个实体:
IpInfoService ips = (IpInfoService)SpringFactory.getObject("ipInfoService");
正因为注解是自动化的,所以一定要避免创建名称一样的Java类。