工具类使用静态方法调用接口还是需要使用第三种方式
在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,无法获取注入容器中的加密服务。
还有就是老老实实构造引用