一.springboot不会扫表到工具类,因为工具类的方法都是静态方法,是属于类的,所以没法加载到容器中。
但是由于Spring/SpringBoot正常情况下不能支持注入静态属性(会报空指针异常)。主要原因在于:Spring的依赖注入实际上是依赖于Set方法进行注入值的,Spring是基于对象层面的依赖注入,而静态属性/静态变量实际上是属于类的。
二.使用工具类发送邮件
核心:
解决方案:
-
给当前的工具类加上@Component,使其成为一个bean对象
-
声明一个静态的属性(加上注解@Autowired),一个非静态的属性。
-
声明一个返回值为void并且不能抛出异常的方法,在其中将非静态属性赋值给静态属性。
-
该方法上加上注解@PostConstruct
-
这样就将service的值注入了进来。示例代码如下:
@Autowired
JavaMailSenderImpl mailSender;//邮箱
@Autowired
static JavaMailSenderImpl JmailSender;//邮箱
@PostConstruct
public void init() {
JmailSender = mailSender;
}
package com.wcy.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@Component
public class EmilUtil {
@Autowired
JavaMailSenderImpl mailSender;//邮箱
@Autowired
static JavaMailSenderImpl JmailSender;//邮箱
@PostConstruct
public void init() {
JmailSender = mailSender;
}
// 随机验证码
public String achieveCode() {
String[] beforeShuffle= new String[] { "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F",
"G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a",
"b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
"w", "x", "y", "z" };
List list = Arrays.asList(beforeShuffle);
Collections.shuffle(list);//置换顺序
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i));
}
String afterShuffle = sb.toString();
String result = afterShuffle.substring(3, 9);//随机拆解数据
System.out.print(result);
return result;
}
/**
* 发送邮箱工具类
* @param from 发送邮箱
* @param to 接收邮箱
* @param title 主题(标题
* @param conetnt 内容
*/
public static Boolean sendEmil(String from,String to,String title,String conetnt){
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);//发件人
message.setTo(to);//收件人
message.setSubject(title);
message.setText(conetnt);//包含验证码
try {
//JavaMailSenderImpl mailSender=new JavaMailSenderImpl();//邮箱
JmailSender.send(message);
System.out.println("发送成功");
return true;
//logger.info("简单邮件已经发送。");
} catch (Exception e) {
System.out.println("发送简单邮件时发生异常!"+e);
}
return false;
}
}
三.springboot使用这两个注解能解决使用静态工具类的方法
在上述代码中@PostConstruct是Java EE5规范之后,Servlet新增的两个影响servlet声明周期的注解之一,另外一个是@PreConstruct。这两个都可以用来修饰一个非静态的返回值为void的方法,并且该方法不能抛出异常。
- 被@PostConstruct注解修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet中的init方法。被该注解修饰的方法会在构造器执行之后,init方法执行之前执行。Spring中允许开发者在受理的Bean中去使用它,当IOC容器被实例化管理当前bean时,被该注解修饰的方法会执行,完成一些初始化的工作。
- 被PreConstruct注解修饰的方法会在服务器卸载Servlet的时候运行,类似于Servlet中的destroy方法。被该注解修饰的方法会在destroy方法执行之后,Servlet彻底卸载之前执行。