工具类Util中如何注解注入Service不报空

前言

实际项目中工具类有时候需要注入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的报错。

每天记录一个小知识,分享是一种快乐,点赞是一种美德!

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 Spring Boot ,可以通过以下方式在 util 工具类获取其他类的 Service: 1. 使用 `@Autowired` 注解,将 Service 注入util 工具类。 例如: ``` @Service public class SomeService { // ... } @Util public class SomeUtil { @Autowired private SomeService someService; // ... } ``` 2. 在 util 工具类的构造函数注入 Service。 例如: ``` @Service public class SomeService { // ... } @Util public class SomeUtil { private final SomeService someService; @Autowired public SomeUtil(SomeService someService) { this.someService = someService; } // ... } ``` 3. 在 util 工具类使用 Spring 的 `ApplicationContext` 获取 Service。 例如: ``` @Util public class SomeUtil { private final SomeService someService; public SomeUtil(ApplicationContext applicationContext) { this.someService = applicationContext.getBean(SomeService.class); } // ... } ``` ### 回答2: 在Spring Boot的Util工具类获取其他类的Service,可以通过以下方式进行操作: 1. 使用@Autowired注解:在Util工具类声明一个成员变量,并使用@Autowired注解进行注入。例如: ```java @Component public class MyUtil { @Autowired private OtherService otherService; // 在工具类可以直接使用otherService进行操作 } ``` 这样,在使用Util工具类的地方,Spring会自动将OtherService的实例注入Util,就可以直接使用了。 2. 使用构造函数注入:在Util工具类定义一个带有OtherService参数的构造函数,并在使用Util工具类时,通过构造函数进行注入。例如: ```java @Component public class MyUtil { private OtherService otherService; public MyUtil(OtherService otherService) { this.otherService = otherService; } // 在工具类可以直接使用otherService进行操作 } ``` 在使用Util工具类的地方,通过构造函数传入OtherService实例,Spring会自动完成注入。 总之,无论是使用@Autowired注解还是使用构造函数注入,都可以在Util工具类获取其他类的Service实例,实现对其他类的调用和操作。 ### 回答3: 在Spring Boot的Util工具类,可以通过使用@Autowired注解来获取其他类的Service。下面是具体的步骤: 1. 在Util工具类引入需要获取Service的类,可以使用@Autowired注解来自动装配该类。 例如,假设需要获取名为MyServiceService类,可以在Util工具类以下代码: ```java @Autowired private MyService myService; ``` 2. 确保Util工具类被Spring Boot所管理,即在该类上添@Component注解。 例如,可以在Util工具类的类声明处上添以下代码: ```java @Component public class MyUtil { // Util工具类的代码 } ``` 3. 确保需要获取的Service类也被Spring Boot所管理,即在该类上添@Service注解。 例如,可以在MyService类的类声明处上添以下代码: ```java @Service public class MyService { // Service类的代码 } ``` 4. 在Util工具类即可通过myService来调用MyService的方法。 例如,可以在Util工具类的方法以下代码: ```java public void doSomething() { myService.someMethod(); } ``` 以上是在Util工具类里如何获取其他类的Service的简要步骤,通过@Autowired注解可以实现自动装配,方便使用其他类的Service

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值