前言
实际项目中工具类有时候需要注入Service,但是工具类中的方法都是静态的,如果像Controler中注入Service那样操作,将会报空,无法获取Service的实例,那么如何才能正确注入,下文是解决方案。
背景
最近接手的项目是某汽车金融的第三方征信系统,后台管理页面的菜单和各种按钮都不是直接写死在页面的,而是配置在数据库中,然后根据登录用户角色权限动态加载的,因此项目中很多地方都要查询当前登录用户拥有的菜单或者按钮权限,看了下之前的代码,每一个业务都重复着查询菜单或者按钮的代码,看的实在难受,如果业务不断扩展,相同的代码不断复制,整个项目也显得臃肿,于是就想着提出来封装到工具类中。
代码示例
话不多说,直接上代码:
/*
* 第一步:工具类一定要用@component进行注解
* @Component 注解作用是把普通POJO实例化到Spring容器中进行管理,相当于配置文件中的<bean id="" class=""/>
*/
@Component
public class MenuAndButtonUtil {
@Autowired
private SysMenusService sysMenusService;
@Autowired
private SysButtonsService sysButtonsService;
/*
* 第二步:建一个静态的本类
*/
private static MenuAndButtonUtil mbUtil;
/*
* 第三步:将本类初始化
* @PostConstruct 注解的作用是标注当前方法在项目启动的时候就执行,也可以理解为在Spring容器启动的时候执行,并且只执行一次,可作为一些数据的常规化加载,比如数据字典之类
*/
@PostConstruct
private void init() {
mbUtil = this;
mbUtil.sysMenusService = this.sysMenusService;
mbUtil.sysButtonsService = this.sysButtonsService;
}
// 返回当前登录用户角色在指定菜单名下的所有按钮权限集合
public static List<SysButtons> getSysButtonsByMenuId(HttpSession session, String menuName) {
List<SysButtons> buttonsList = null;
try {
/*
* 第四步:Service的调用一定要是 静态本类.xxService.xxMethod();
*/
List<SysMenus> sysMenus = mbUtil.sysMenusService.findByMenuName(menuName);
String operateMenuId = sysMenus.size() == 1 ? sysMenus.get(0).getMenuId() : "wrong";
SysUsers user = (SysUsers) session.getAttribute("SysUser");
buttonsList = (List<SysButtons>) mbUtil.sysButtonsService.findByMenuId(user.getRoleCode(), operateMenuId);
} catch (Exception e) {
e.printStackTrace();
}
return buttonsList;
}
}
如上,便不会再出现Service为Null的报错。
每天记录一个小知识,分享是一种快乐,点赞是一种美德!