SpringBoot @Autowired中注入静态方法或者静态变量
注:用static去定义一个注入的方法或者配置文件值变量,编译时不会有任何异常,运行时会报空指针。
Spring官方不推荐此种方法。
原理:
https://www.cnblogs.com/chenfeng1122/p/6270217.html
解决办法
利用spring的set注入方法,通过非静态的setter方法注入静态变量 ,我们可以改成这样就静态变量可以获取到你配置的信息了。
把get,set方法的static 修饰符去掉,然后在set方法上面加@Autowired即可
- /** 阿里云OSS配置查询 */
- private static OSSConfMapper ossConfMapper;
- /** 阿里云OSS图片上传 */
- private static UploadImgOSS uploadImgOSS;
- public OSSConfMapper getOssConfMapper() {
- return ossConfMapper;
- }
- @Autowired
- public void setOssConfMapper(OSSConfMapper ossConfMapper) {
- UploadUtil.ossConfMapper = ossConfMapper;
- }
- public UploadImgOSS getUploadImgOSS() {
- return uploadImgOSS;
- }
- @Autowired
- public void setUploadImgOSS(UploadImgOSS uploadImgOSS) {
- UploadUtil.uploadImgOSS = uploadImgOSS;
- }
参考文档
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时实现。
代码如下
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.mail.SimpleMailMessage;
- import org.springframework.mail.javamail.JavaMailSender;
- import org.springframework.stereotype.Component;
- import tylin.paas.transfers.util.DateUtil;
- import javax.annotation.PostConstruct;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.LinkedList;
- import java.util.List;
- @Slf4j
- @Component
- public class ErrorHandler {
- @Value("${customer.mail.bankMail.sender}")
- private String configSender;
- private static String sender;
- @Value("${customer.mail.bankMail.receiver}")
- private String configReceiver;
- private static String receiver;
- public static ErrorHandler errorHandler;
- @Autowired
- JavaMailSender autoJavaMailSender;
- private static JavaMailSender javaMailSender;
- @PostConstruct
- public void init() {
- sender = configSender;
- receiver = configReceiver;
- javaMailSender = autoJavaMailSender;
- errorHandler = this;
- }
- public static void sendMail() {
- SimpleMailMessage message = new SimpleMailMessage();
- message.setFrom(sender);
- message.setTo(receiver.split(";"));
- message.setSubject("your subject");
- message.setText("your content text");
- try {
- javaMailSender.send(message);
- log.info("发送邮件成功!");
- } catch (Exception e) {
- log.error("发送邮件时发生异常!", e);
- }
- }
- }
方式二:
在set时注入
- import lombok.extern.slf4j.Slf4j;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.mail.SimpleMailMessage;
- import org.springframework.mail.javamail.JavaMailSender;
- import org.springframework.stereotype.Component;
- import org.springframework.test.context.junit4.SpringRunner;
- import org.tylin.TylinERPApplication;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- @Slf4j
- @Component
- @SpringBootTest(classes = TylinERPApplication.class)
- @RunWith(SpringRunner.class)
- public class MailAutoSendTest {
- private static String sender;
- //可以不要
- public String getSender() {
- return sender;
- }
- @Value("${customer.mail.bankMail.sender}")
- public void setSender(String sender) {
- MailAutoSendTest.sender = sender;
- }
- private static String receiver;
- //可以不要
- public String getReceiver() {
- return receiver;
- }
- @Value("${customer.mail.bankMail.receiver}")
- public void setReceiver(String receiver) {
- MailAutoSendTest.receiver = receiver;
- }
- private static JavaMailSender javaMailSender;
- public JavaMailSender getJavaMailSender(){
- return javaMailSender;
- }
- @Autowired
- public void setJavaMailSender(JavaMailSender javaMailSender){
- MailAutoSendTest.javaMailSender = javaMailSender;
- }
- @Test
- public void sendMail() {
- SimpleMailMessage message = new SimpleMailMessage();
- message.setFrom(sender);
- log.info(sender);
- log.info(receiver);
- message.setTo(receiver.split(";"));
- message.setSubject("xxxx");
- Date date = new Date();
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- message.setText("xxxx"+dateFormat.format(date));
- try {
- javaMailSender.send(message);
- log.info("简单邮件已经发送。");
- } catch (Exception e) {
- log.error("发送简单邮件时发生异常!", e);
- }
- }
- }
SpringBoot @Autowired中注入静态方法或者静态变量的更多相关文章
- C#中类的实例是不能 获取到类中的静态方法和静态变量(Static)的,及原因
类中的静态方法和变量是共享的.只能用类名去调用.
- FreeMarker调用Java静态方法以及静态变量的方法
这里介绍下在类似 Spring+FreeMarker 的架构中如何在FreeMarker中访问Java中的静态方法以及静态变量. 一.首先为了方便以及可复用我们创建一个工具类 /** * FreeMa ...
- java中的static使用--静态变量、静态方法
Java 中的 static 使用之静态变量 大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 s ...
- 内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例
内部类访问外部类的变量必须是final吗? 如下: package com.java.concurrent; class A { int i = 3; public void shout() { cl ...
- C#中静态类、静态方法和静态变量的简单说明
静态方法与静态变量一样,属于类本身,而不属于哪个类的一个对象.调用一个被定义为static的方法,只有通过在它前面加上这个类的名称.一般定义里说是可以通过实例调用的.其他语言我还没测试,但是在C#中是 ...
- 关于Java的静态:静态类、静态方法、静态变量、静态块等
原文地址:Java static keyword - Class, Method, Variable, Block, import - JournalDev 很少看到文章能把静态这个问题解释的很清楚, ...
- java之静态方法,静态变量
在自动化测试中,经常会用到静态方法和静态变量.那么什么是静态方法和静态变量呢?以及在什么情况下使用呢?下面来说一说 静态方法和静态变量是使用公共内存空间的,就是说所有对象都可以直接引用,不需要创建对象 ...
- js中的全局变量和静态变量的使用, js 的调试?- 如果js出错, js引擎 就会停止, 这会 导致 后面的 html中 refer 该函数时, 会报错 函数为定义!!
效果里面的函数, 如show, hide,slideDown等, 这些都叫 "效果"函数, 但是里面可以包含动画, 也可以 不包含动画. 动画,是指 元素 的内容 是 逐渐 显示/ ...
- Swift中的类型属性(静态变量)
http://blog.haohtml.com/archives/15098 Swift中的类型属性(静态变量) Posted on 2014/06/13 类型属性语法 在 C 或 Objective ...
随机推荐
- 基于TCP通过socketserver简单实现并发效果
一.首先介绍一下 socketserver 模块中的类: 类 描述 BaseServer 包含服务器的核心功能与混合(mix-in)类的钩子功能.这个类用于派生,不要直接生成这个类的类对象 TCPSe ...
- 树莓派安装系统+ssh登录
一.准备工作: (1)树莓派3b (2)官网下载系统 (3)SD卡 (4)网线 (5)SDFormatter.exe (6)win32diskimager.exe (7)putty (7)笔记本 二. ...
- bat文件中运行python脚本方法
在脚本中使用start命令: @echo off start python xxx.py 注: start命令:启动单独的“命令提示符”窗口来运行指定程序或命令.如果在没有参数的情况下使用,start ...
- Linux命令——mount、umount
前言 由于引入了LVM.RAID技术,导致OS时别到的磁盘已经不单纯是事实意义上的物理磁盘(虽然OS认为他是物理盘).传统文件系统与分区可以认为是1:1关系,但是现在一个分区可以有多个FS,一个FS也 ...
- php数字字母字符串比较
<?php$a="12a";if($a==12){echo "good";}?>这种情况能输出good,字母在后时只比较前两位,认为是相等:字母在前 ...
- 2013.9.3 - OpenNER第十一天
下午接受了天猫某高管的交叉面试,在图书馆电面的,感觉面的不怎么好,他先问了我飞天的情况,还有我做了什么,他感觉和我聊不到一起去,我感觉应该是下午在地下铁喝的那杯咖啡让我慌了神,后来他又问了大数组抽取最 ...
- SQLAlchemy多对多
创建多对多表 from sqlalchemy.ext.declarative import declarative_base Base=declarative_base() from sqlalche ...
- C#使用ODP.NET(Oracle.ManagedDataAccess.dll)操作Oracle数据库
在刚接触C#的时候由于公司使用的就是Oracle数据库,那么C#怎么连接Oracle数据库就成了首要去掌握的知识点了.在那时没有ODP.NET,但visual studio却对Oralce数据库的调用 ...
- 《逆袭团队》第八次团队作业:Alpha冲刺
项目 内容 软件工程 任课教师博客主页链接 作业链接地址 团队作业8:Alpha冲刺 团队名称 逆袭团队 具体目标 完成最后冲刺阶段的5次博客 一.团队项目github仓库地址:Github 二.Sc ...
- template_constructor_function
#include <iostream> using namespace std; template <class T> class MyClass{ public: templ ...