之前有过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类。