java - Spring Bean 未在应用程序启动时初始化

标签 java spring hibernate

在我的应用程序中,我想在点击应用程序 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 适用于实例(即在非静态上下文中),因此应用程序中的 systemServicenull

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

@Autowired
private static SystemService systemService;

这是根本错误的。你不能 Autowiring 静态字段,这在Spring(或任何类似的框架)中绝对没有意义。 Spring bean 是实例,框架将 Autowiring 字段设置为对其他 Spring bean 的引用。

关于java - Spring Bean 未在应用程序启动时初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32907089/

相关文章:

java - Hibernate 实体类未拾取

java - 从 Java 中的 InputStream 读取 ESRI shapefile

java - 使用具有关系的 Spring Data REST 发布实体

java - 从文件夹制作jar文件

java - 在另一个方法中创建的方法中使用数组

spring - 如何配置 Spring 和 Apache Tiles 定义以从类路径解析 jsps

java - Spring @async 复制 session

java - Java 注解的工作

java - 如何在二叉搜索树中查找节点

Java机器人类在笔记本电脑上工作但在电脑上不工作