工具类静态方法调用service接口(注入容器失败原因)

工具类使用静态方法调用接口还是需要使用第三种方式

在Spring Boot中,如果你想在自定义工具类中调用Service层的方法,通常有三种方式可以实现:

1通过依赖注入(Dependency Injection):这是推荐的方式,因为它符合Spring框架的设计思想,能够更好地管理和组织各个组件之间的依赖关系。

首先,在你的自定义工具类中,需要定义一个Service层的成员变量,并使用@Autowired注解进行自动注入。例如:

@Component 
public class YourCustomUtils {
 @Autowired 
private YourServiceClass yourService; // 在这里可以使用yourService调用Service层的方法 
} 

然后,在Spring Boot的配置类或者启动类上,使用@ComponentScan注解扫描自定义工具类所在的包,以确保Spring Boot能够正确地实例化该工具类。

2使用ApplicationContext获取Bean实例:如果你的自定义工具类不是由Spring管理的对象,或者无法使用依赖注入的方式,可以尝试使用ApplicationContext来获取Service层的Bean实例。

首先,在你的自定义工具类中,需要注入ApplicationContext对象,并使用getBean()方法获取Service层的Bean实例。例如:

public class YourCustomUtils { 
   private ApplicationContext applicationContext;
   public YourCustomUtils(ApplicationContext applicationContext) { this.applicationContext = applicationContext; 
   }
 public void yourMethod() {
 YourServiceClass yourService = applicationContext.getBean(YourServiceClass.class); //
在这里可以使用yourService调用Service层的方法 
  }
 } 

然后,在调用自定义工具类的地方,需要手动传入ApplicationContext对象。例如:

public class YourCallerClass { 
public static void main(String[] args) { 
   ApplicationContext context = SpringApplication.run(YourApplication.class, args); YourCustomUtils utils = new YourCustomUtils(context); // 使用utils调用yourMethod()方法 } } 

以上是在Spring Boot中调用Service层方法的两种常见方式。你可以根据具体场景选择适合的方式来使用。希望对你有所帮助!

3、需要把工具类注入到ioc容器里面。

package com.util;

import com.entity.model.sys.SysUser;
import com.service.sys.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;

@Component
public class SecurityUtils {
    /**
     * 系统用户管理对象。
     */
    @Autowired
    private SysUserService userService;
    /**
     * 内部-系统用户管理对象。
     */
    private static SysUserService innerUserService;

    /**
     * 初始化。
     */
    @PostConstruct
    private void initialize() {
        SecurityUtils.innerUserService = this.userService;
    }

    /**
     * 获取当前请求对象。
     *
     * @return
     */
    public static HttpServletRequest getRequest() {
        try {
            return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        } catch (Exception ex) {
        }
        return null;
    }

    /**
     * 获取当前用户信息。
     *
     * @return
     */
    public static SysUser getSysUser() {
        HttpServletRequest _request = getRequest();
        if (_request != null) {
            return innerUserService.getLoginUserByRequest(_request);
        }
        return null;
    }
}

springboot自定义工具类中,如何调用service层方法_springboot 工具类调用service_全子兄的博客-CSDN博客

失败案例

 自定义一个mybatis拦截器注入SqlSessionFactory时,new一个新对象没有注入spring容器导致引入加密服务为空Null 原因就是new CustomizeMybatisDataSecurityHandlerInterceptor没有注入到容器不能使用容器ApplicationContext,无法获取注入容器中的加密服务。

还有就是老老实实构造引用

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值