首页 > 其他分享 >【Spring】静态方法(工具类)中调用Spring管理的Bean

【Spring】静态方法(工具类)中调用Spring管理的Bean

时间:2023-04-21 20:45:42浏览次数:29  
标签:静态方法 String Spring sign Bean signRepository public

背景

在一些业务开发,经常会写一些工具类,但这些工具类时常需要调用到 Spring管理的bean,这些Spring管理的bean 注入,
平常用的都是 @Autowired 注解一个成员变量,
问题就来了:
(1)成员变量(即Spring管理的bean)是非静态的,但工具类都是想写静态方法,静态方法不能引入一个非静态的变量。所以在静态方法里面写不了
(2)如果把成员变量(即Spring管理的bean)写成静态的话,这样的话,静态方法是可以用这个变量了,但是运行的时候,会喜提一个NPE。

比如下面这个例子, signRepository 会 NPE

@Component
public class ScriptExecuteContent {
 
@Autowired
private static SignRepository signRepository;
 
public static String checkSign(String certNo, String acctNo, String instCode) {
    Sign sign = signRepository.findByCertNoAndAcctNoAndInstCode(certNo, acctNo, instCode);
    if (null != sign
            && StringUtils.equals(sign.getStatus(), StatusEnum.SUCCESS.code())
            && DateUtil.getCurrentDate().before(sign.getExpireTime())) {
        return "1";
    } else {
        return "0";
    }
}
}

静态方法怎样引入Spring管理的Bean呢

方法有二(应该不止两种,这里只说两种比较方便点的)

1、 @Autowired 用在构造函数上 (@Resource 也是一样的)
@Component
public class ScriptExecuteContent {

// 成员变量变成 static
private static SignRepository signRepository;


// 构造函数加上 @Autowired
@Autowired
public ScriptExecuteContent(SignRepository signRepository) {
    ScriptExecuteContent.signRepository = signRepository;
}

// 静态方法就可以用了
public static String checkSign(String certNo, String acctNo, String instCode) {
    Sign sign = signRepository.findByCertNoAndAcctNoAndInstCode(certNo, acctNo, instCode);
    if (null != sign
            && StringUtils.equals(sign.getStatus(), StatusEnum.SUCCESS.code())
            && DateUtil.getCurrentDate().before(sign.getExpireTime())) {
        return "1";
    } else {
        return "0";
    }
}
}
2、 使用 @PostConstruct 注解
@Component
public class ScriptExecuteContent {

// 这里定义成员变量
@Autowired
private SignRepository signRepository;

// 要把类也变成静态变量?
private static ScriptExecuteContent scriptExecuteContent;

// 构造方法
@PostConstruct
public void init() {
    scriptExecuteContent = this;
    scriptExecuteContent.signRepository = this.signRepository;
}

// 静态方法,用的时候是 scriptExecuteContent.signRepository 
public static String checkSign(String certNo, String acctNo, String instCode) {
    Sign sign = scriptExecuteContent.signRepository.findByCertNoAndAcctNoAndInstCode(certNo, acctNo, instCode);
    if (null != sign
            && StringUtils.equals(sign.getStatus(), StatusEnum.SUCCESS.code())
            && DateUtil.getCurrentDate().before(sign.getExpireTime())) {
        return "1";
    } else {
        return "0";
    }
}
}

嗯,通过这两种方式,也基本够用了。

还有另外一些方式,,,,, aware 还是啥的,后补吧。。。

标签:静态方法,String,Spring,sign,Bean,signRepository,public
From: https://www.cnblogs.com/aaacarrot/p/17341744.html

相关文章

  • SpringSecurity
     https://www.cnblogs.com/SjhCode/p/SpringSecurity.htmlpermitAll() :无条件允许任何形式访问,不管你登录还是没有登录。anonymous() :允许匿名访问,也就是没有登录才可以访问。denyAll() :无条件决绝任何形式的访问。authenticated():只允许已认证的用户访问。fullyAuthe......
  • 部署Spring Boot + React前后端分离中的奇特发现
    今天在尝试在服务器上部署SpringBoot+React前后端分离应用时有一个奇特的发现。服务器首先是前端npmrunbuild之后,将构建好的应用移动到/var/www/html文件夹,nginx启动可以正常访问,axios接口访问地址为localhost:8080;后端maven构建并运行。本地电脑同样开始运行前后端。......
  • springboot定时同步数据,从sqlserver到mysql
    https://www.cnblogs.com/SjhCode/p/sqlserverToMysql.html定时同步数据,从sqlserver到mysql 注意事项:一.primary:master #设置默认的数据源或者数据源组,默认值即为master二.@Scheduled()和 @DS("slave_1")注解 步骤:1.在原先运行的程序外,新建多加一个springboot程序......
  • SpringBoot邮箱注册
    首先在pom.xml导入依赖<!--springboot邮件mail--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.7.2</v......
  • Spring Boot中 自定义注解
    SpringBoot中自定义注解定义一个注解创建一个Java注解,可以使用@interface关键字来定义,例如:less@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceMyAnnotation{Stringvalue()default"";}这个注解称为MyAnnotation,并且它具......
  • Spring cloud:开发接口
    @RequestBody支持json格式,前端传过来某类型的数据,后端直接可以用@RequestParam?id=1此类传参,有时候会导致类型不能转换错误例如,前端页面分页,传过来的page、size,在地址栏显示,路径后?id=xx ,两个数据明显是int,如果用了@RequestParam接收多个参数后端以Map接收,不能直接接收,且报类型......
  • spring boot、cloud -yml:显示/show SQL
    logging:level:com.zking.zkingOAS.FDadmin.mapper:debug在控制台显示业务具体执行的SQL,且有参数说明、有多少数据 application.properties:logging.level.com.wochat.mapper=debug ......
  • redis:清空 spring boot注解式
    flushall清空打开D:\ProgramFiles\Java\Redis-x64-3.2.100\redis-cli.exeauth123456flushall  dockerdockerexec-it65e343434e6eredis-cliauth123flushall exit @Cacheable :根据方法的请求参数对其结果进行缓存参数解释examplevalue缓存的名称,在spring配置文......
  • Spring cloud:分布式module
     新增一个业务模块,统一将业务模块放在hc-modeules下在resources资源目录下新增application-properties.yml文件 该文件用来配置注册中心、配置中心信息等..在pom.xml文件添加jar包的依赖以及配置指向的父级<parent> <groupId>com.github.pig</groupId> <artifactId>pig-modu......
  • SpringCloud中使用Apollo实现动态刷新
    SpringSpringBootSpringCloud中使用Apollo实现动态刷新普通字段在需要刷新的字段上使用@value注解即可,例如:@Value("${test.user.name}")privateStringname;@Value("${test.user.age}")privateIntegerage;@Value("${test.user.sex}")......