注:用static去定义一个注入的方法或者配置文件值变量,编译时不会有任何异常,运行时会报空指针。

Spring官方不推荐此种方法。

原理:

https://www.cnblogs.com/chenfeng1122/p/6270217.html

解决办法

利用spring的set注入方法,通过非静态的setter方法注入静态变量 ,我们可以改成这样就静态变量可以获取到你配置的信息了。

把get,set方法的static 修饰符去掉,然后在set方法上面加@Autowired即可

  1. /** 阿里云OSS配置查询 */
  2. private static OSSConfMapper ossConfMapper;
  3. /** 阿里云OSS图片上传 */
  4. private static UploadImgOSS uploadImgOSS;
  5.  
  6. public OSSConfMapper getOssConfMapper() {
  7. return ossConfMapper;
  8. }
  9. @Autowired
  10. public void setOssConfMapper(OSSConfMapper ossConfMapper) {
  11. UploadUtil.ossConfMapper = ossConfMapper;
  12. }
  13. public UploadImgOSS getUploadImgOSS() {
  14. return uploadImgOSS;
  15. }
  16. @Autowired
  17. public void setUploadImgOSS(UploadImgOSS uploadImgOSS) {
  18. UploadUtil.uploadImgOSS = uploadImgOSS;
  19. }

参考文档

https://blog.csdn.net/kongrun12/article/details/76246369

https://blog.csdn.net/zxl646801924/article/details/81738231

https://blog.csdn.net/u014079773/article/details/66973830

经过尝试,有两种实现方式

方式一:声明一个静态的变量或方法,再相应的注入一个对应的变量和方法,最后PostConstruct注解在init时实现。

代码如下

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.mail.SimpleMailMessage;
  5. import org.springframework.mail.javamail.JavaMailSender;
  6. import org.springframework.stereotype.Component;
  7. import tylin.paas.transfers.util.DateUtil;
  8.  
  9. import javax.annotation.PostConstruct;
  10. import java.text.SimpleDateFormat;
  11. import java.util.Date;
  12. import java.util.LinkedList;
  13. import java.util.List;
  14.  
  15. @Slf4j
  16. @Component
  17. public class ErrorHandler {
  18.  
  19. @Value("${customer.mail.bankMail.sender}")
  20. private String configSender;
  21.  
  22. private static String sender;
  23.  
  24. @Value("${customer.mail.bankMail.receiver}")
  25. private String configReceiver;
  26.  
  27. private static String receiver;
  28.  
  29. public static ErrorHandler errorHandler;
  30.  
  31. @Autowired
  32. JavaMailSender autoJavaMailSender;
  33.  
  34. private static JavaMailSender javaMailSender;
  35.  
  36. @PostConstruct
  37. public void init() {
  38. sender = configSender;
  39. receiver = configReceiver;
  40. javaMailSender = autoJavaMailSender;
  41. errorHandler = this;
  42. }
  43.  
  44. public static void sendMail() {
  45.  
  46. SimpleMailMessage message = new SimpleMailMessage();
  47. message.setFrom(sender);
  48. message.setTo(receiver.split(";"));
  49. message.setSubject("your subject");
  50. message.setText("your content text");
  51.  
  52. try {
  53. javaMailSender.send(message);
  54. log.info("发送邮件成功!");
  55. } catch (Exception e) {
  56. log.error("发送邮件时发生异常!", e);
  57. }
  58.  
  59. }
  60.  
  61. }

方式二:

在set时注入

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.junit.Test;
  3. import org.junit.runner.RunWith;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.mail.SimpleMailMessage;
  8. import org.springframework.mail.javamail.JavaMailSender;
  9. import org.springframework.stereotype.Component;
  10. import org.springframework.test.context.junit4.SpringRunner;
  11. import org.tylin.TylinERPApplication;
  12.  
  13. import java.text.SimpleDateFormat;
  14. import java.util.Date;
  15.  
  16. @Slf4j
  17. @Component
  18. @SpringBootTest(classes = TylinERPApplication.class)
  19. @RunWith(SpringRunner.class)
  20. public class MailAutoSendTest {
  21. private static String sender;
  22.  
  23. //可以不要
  24. public String getSender() {
  25. return sender;
  26. }
  27. @Value("${customer.mail.bankMail.sender}")
  28. public void setSender(String sender) {
  29. MailAutoSendTest.sender = sender;
  30. }
  31.  
  32. private static String receiver;
  33.  
  34. //可以不要
  35. public String getReceiver() {
  36. return receiver;
  37. }
  38.  
  39. @Value("${customer.mail.bankMail.receiver}")
  40. public void setReceiver(String receiver) {
  41. MailAutoSendTest.receiver = receiver;
  42. }
  43.  
  44. private static JavaMailSender javaMailSender;
  45.  
  46. public JavaMailSender getJavaMailSender(){
  47. return javaMailSender;
  48. }
  49.  
  50. @Autowired
  51. public void setJavaMailSender(JavaMailSender javaMailSender){
  52. MailAutoSendTest.javaMailSender = javaMailSender;
  53. }
  54.  
  55. @Test
  56. public void sendMail() {
  57. SimpleMailMessage message = new SimpleMailMessage();
  58. message.setFrom(sender);
  59. log.info(sender);
  60. log.info(receiver);
  61. message.setTo(receiver.split(";"));
  62. message.setSubject("xxxx");
  63.  
  64. Date date = new Date();
  65. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  66.  
  67. message.setText("xxxx"+dateFormat.format(date));
  68.  
  69. try {
  70. javaMailSender.send(message);
  71. log.info("简单邮件已经发送。");
  72. } catch (Exception e) {
  73. log.error("发送简单邮件时发生异常!", e);
  74. }
  75. }
  76.  
  77. }

SpringBoot @Autowired中注入静态方法或者静态变量的更多相关文章

  1. C#中类的实例是不能 获取到类中的静态方法和静态变量(Static)的,及原因

    类中的静态方法和变量是共享的.只能用类名去调用.

  2. FreeMarker调用Java静态方法以及静态变量的方法

    这里介绍下在类似 Spring+FreeMarker 的架构中如何在FreeMarker中访问Java中的静态方法以及静态变量. 一.首先为了方便以及可复用我们创建一个工具类 /** * FreeMa ...

  3. java中的static使用--静态变量、静态方法

    Java 中的 static 使用之静态变量 大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 s ...

  4. 内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

    内部类访问外部类的变量必须是final吗? 如下: package com.java.concurrent; class A { int i = 3; public void shout() { cl ...

  5. C#中静态类、静态方法和静态变量的简单说明

    静态方法与静态变量一样,属于类本身,而不属于哪个类的一个对象.调用一个被定义为static的方法,只有通过在它前面加上这个类的名称.一般定义里说是可以通过实例调用的.其他语言我还没测试,但是在C#中是 ...

  6. 关于Java的静态:静态类、静态方法、静态变量、静态块等

    原文地址:Java static keyword - Class, Method, Variable, Block, import - JournalDev 很少看到文章能把静态这个问题解释的很清楚, ...

  7. java之静态方法,静态变量

    在自动化测试中,经常会用到静态方法和静态变量.那么什么是静态方法和静态变量呢?以及在什么情况下使用呢?下面来说一说 静态方法和静态变量是使用公共内存空间的,就是说所有对象都可以直接引用,不需要创建对象 ...

  8. js中的全局变量和静态变量的使用, js 的调试?- 如果js出错, js引擎 就会停止, 这会 导致 后面的 html中 refer 该函数时, 会报错 函数为定义!!

    效果里面的函数, 如show, hide,slideDown等, 这些都叫 "效果"函数, 但是里面可以包含动画, 也可以 不包含动画. 动画,是指 元素 的内容 是 逐渐 显示/ ...

  9. Swift中的类型属性(静态变量)

    http://blog.haohtml.com/archives/15098 Swift中的类型属性(静态变量) Posted on 2014/06/13 类型属性语法 在 C 或 Objective ...

随机推荐

  1. 基于TCP通过socketserver简单实现并发效果

    一.首先介绍一下 socketserver 模块中的类: 类 描述 BaseServer 包含服务器的核心功能与混合(mix-in)类的钩子功能.这个类用于派生,不要直接生成这个类的类对象 TCPSe ...

  2. 树莓派安装系统+ssh登录

    一.准备工作: (1)树莓派3b (2)官网下载系统 (3)SD卡 (4)网线 (5)SDFormatter.exe (6)win32diskimager.exe (7)putty (7)笔记本 二. ...

  3. bat文件中运行python脚本方法

    在脚本中使用start命令: @echo off start python xxx.py 注: start命令:启动单独的“命令提示符”窗口来运行指定程序或命令.如果在没有参数的情况下使用,start ...

  4. Linux命令——mount、umount

    前言 由于引入了LVM.RAID技术,导致OS时别到的磁盘已经不单纯是事实意义上的物理磁盘(虽然OS认为他是物理盘).传统文件系统与分区可以认为是1:1关系,但是现在一个分区可以有多个FS,一个FS也 ...

  5. php数字字母字符串比较

    <?php$a="12a";if($a==12){echo "good";}?>这种情况能输出good,字母在后时只比较前两位,认为是相等:字母在前 ...

  6. 2013.9.3 - OpenNER第十一天

    下午接受了天猫某高管的交叉面试,在图书馆电面的,感觉面的不怎么好,他先问了我飞天的情况,还有我做了什么,他感觉和我聊不到一起去,我感觉应该是下午在地下铁喝的那杯咖啡让我慌了神,后来他又问了大数组抽取最 ...

  7. SQLAlchemy多对多

    创建多对多表 from sqlalchemy.ext.declarative import declarative_base Base=declarative_base() from sqlalche ...

  8. C#使用ODP.NET(Oracle.ManagedDataAccess.dll)操作Oracle数据库

    在刚接触C#的时候由于公司使用的就是Oracle数据库,那么C#怎么连接Oracle数据库就成了首要去掌握的知识点了.在那时没有ODP.NET,但visual studio却对Oralce数据库的调用 ...

  9. 《逆袭团队》第八次团队作业:Alpha冲刺

    项目 内容 软件工程 任课教师博客主页链接 作业链接地址 团队作业8:Alpha冲刺 团队名称 逆袭团队 具体目标 完成最后冲刺阶段的5次博客 一.团队项目github仓库地址:Github 二.Sc ...

  10. template_constructor_function

    #include <iostream> using namespace std; template <class T> class MyClass{ public: templ ...