gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:54:10 27 4
gpt4 key购买 nike

在我的应用程序中,我想在点击应用程序 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com