在我的应用程序中,我想在点击应用程序 url 之前初始化 bean,并存储下拉列表的常用值。这是bean的声明
<beans:bean id="listService" class="com.system.beans.DropDownList"
init-method="populateMasterList" scope="application"/>
Bean:
public class DropDownList implements InitializingBean
{
private static final Logger logger = LoggerFactory.getLogger(DropDownList.class);
public static Map<String, Map<Integer, String>> listMap = new HashMap<String, Map<Integer, String>>();
@Autowired
private static SystemService systemService;
@Autowired(required = true)
@Qualifier(value = "systemService")
public void setSystemService(SystemService systemService)
{
this.systemService = systemService;
}
@PostConstruct
public static Map<String, Map<Integer, String>> populateMasterList()
{
logger.debug("Calling Institute Info Masters");
List<InstituteInfoMaster> masterList = systemService.listInstituteInfoMasters();
Map<Integer, String> masterMap = new HashMap<Integer, String>();
masterMap.put(0, "---Select---");
masterList.forEach((master) ->
{
masterMap.put(master.getListId(), master.getValue());
});
logger.debug("Created Map for List Masters");
listMap.put("infoList", masterMap);
return listMap;
}
public Map<String, Map<Integer, String>> getListMap()
{
return listMap;
}
public static void setListMap()
{
listMap = populateMasterList();
}
@Override
public void afterPropertiesSet() throws Exception
{
populateMasterList();
}
}
我观察到它不会在应用程序启动时初始化。当我尝试通过调用 DropDownList.setListMap(); 来更新 master 时,它给出了 NullPointerException 。但如果我调用 jsp 页面,我将 map 调用为 ${listService.listMap['infoList']}
,如果我尝试保存它执行的 master,它会在 jsp 上显示下拉菜单成功地。
这意味着当我调用 jsp 页面时,我在其中显示下拉列表,此时它仅初始化 bean,而不是在应用程序启动时初始化。
最佳答案
实际问题是您没有静态访问 Spring bean,而是静态访问类。当您使用该 bean,即 listService
实例时,Spring 将在您第一次访问时为您初始化它。
您正在调用静态方法,但是当发生这种情况时,不会填充依赖的 bean。 Autowiring 适用于实例(即在非静态上下文中),因此应用程序中的 systemService
为 null
。
更新:我刚刚意识到这一行:
@Autowired
private static SystemService systemService;
这是根本错误的。你不能 Autowiring 静态字段,这在Spring(或任何类似的框架)中绝对没有意义。 Spring bean 是实例,框架将 Autowiring 字段设置为对其他 Spring bean 的引用。
关于java - Spring Bean 未在应用程序启动时初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32907089/