• 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);
            }
        }
    
    }
    复制代码
     
    分类: JavaSpringBoot
  • 相关阅读:
    vagrantfile 示例
    服务器raid查看
    redis 使用记录
    golang 典型并发任务
    percona-server-mongodb 通用二进制下载
    命令之iperf-服务器之间网络测速
    用awk在命令行处理分析日志
    python是解释型还是编译型
    使用github action发布python包到Pypi
    算法图解学习系列--第6章--广度优先搜索算法BFS
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/12099382.html
Copyright © 2020-2023  润新知