gpt4 book ai didi

java - 在 Controller 、spring 内部的 @postconstruct 方法中实例化 @autowired bean

转载 作者:行者123 更新时间:2023-11-30 02:36:13 26 4
gpt4 key购买 nike

我想为所有 Controller 调用一个公共(public)服务来获取一个公共(public) ModelAndView 对象,其中包含一些公共(public)对象。

因此,我为所有 Controller 创建了一个父类(super class) - BaseController,并且通过调用方法 initCommonData 来启动 BaseController 构造函数内的公共(public)模型对象,该方法使用 @Autowired bean CommonDataService,该方法在构造时不存在对象的时间并返回 null,所以我应该做什么才能在构造函数内获取 @autowired 依赖项。

仅供引用 - 我正在使用此通用服务和通用数据来获取一些将在站点页眉和页脚中的每个 jsp 上使用的commod 数据。因此,如果有另一种方法可以在不调用每个 Controller 方法中的公共(public)服务的情况下执行此操作,请在每个 Controller 中提出建议。这是我的代码 -基础 Controller

@Controller
public class BaseController {

@Autowired
private CommonDataService commonDataService;

protected ModelAndView model;

public BaseController() {
this.initCommonData();
}

public void initCommonData(){
this.model = new ModelAndView();
this.model.addObject("headerData",commonDataService.getHeaderData());
this.model.addObject("footerData",commonDataService.getFooterData());
}

子类 Controller -

@Controller
public class HomeController extends BaseController {

@Autowired
CategoryService categoryService;

@Autowired
CompanyService companyService;

@RequestMapping(value = { "", "/", "home" })
public ModelAndView homePage() {
model.setViewName("home");
.
.
.
model.addObject("name", value);
model.addObject("name2", value2);
return model;
}

公共(public)服务类 -

@Service
public class CommonDataService {

@Autowired
CompanyService companyService;

@Autowired
CategoryService categoryService;

@Cacheable
public List<Category> getHeaderData(){
return categoryService.getTopCategoryList();
}

@Cacheable
public List<Company> getFooterData(){
return companyService.getTopCompanyList();
}

请建议是否有其他好的方法可以做到这一点,从服务器获取通用数据到jsp。

最佳答案

无论@Andreas建议什么,都是最好的解决方案,即将您的BaseController标记为abstract并使用@Postconstruct。这是完美的场景,因为 BaseController 本身在您的情况下不拥有任何 url 映射,因此不要将其标记为 @Controller

由于任何原因,如果您正在寻找其他选项,您可以考虑将 BaseController 标记为 @Component 并使用 @Postconstruct对于 initCommonData ,一旦 Spring 容器加载了 BaseController bean,就会自动调用此方法:

@Component
public class BaseController {

@Autowired
private CommonDataService commonDataService;

protected ModelAndView model;

@Postconstruct
public void initCommonData(){
this.model = new ModelAndView();
this.model.addObject("headerData",commonDataService.getHeaderData());
this.model.addObject("footerData",commonDataService.getFooterData());
}
}

关于java - 在 Controller 、spring 内部的 @postconstruct 方法中实例化 @autowired bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43014380/

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