Spring Bean没有在Application启动时初始化

时间:2015-10-02 12:22:26

标签: java spring hibernate

在我的应用程序中,我想在命中应用程序URL之前初始化bean,并存储下拉列表的公共值。这里是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();

我发现它在应用程序启动时没有初始化。当我尝试通过调用NullPointerException来更新主人时,它会${listService.listMap['infoList']}。但是如果我调用jsp页面,我将Map调用为{{1}},它会在jsp之后显示下拉,如果我尝试保存master,它会成功执行。

这意味着当我调用jsp页面时,我显示下拉时间只是初始化bean而不是在应用程序启动时。

1 个答案:

答案 0 :(得分:1)

实际问题是你不是静态地访问Spring bean ,而是访问类。当您使用bean时,即listService实例,Spring会在首次访问时为您初始化它。

您正在调用静态方法,但是当发生这种情况时,不会填充依赖bean。自动装配适用于实例(即在非静态环境中),因此应用程序中systemServicenull

更新:我刚刚意识到这一行:

@Autowired
private static SystemService systemService;

这从根本上说是错误的。你不能自动装配静态字段,它在Spring(或任何类似的框架)中完全没有意义。 Spring bean是实例,框架将autowired字段设置为对其他spring bean的引用。