Spring 在静态工具类中使用注解注入bean

问题

最近在项目中遇到这样一个情况:有一个发送邮件的工具类。在这个工具类中提供了几种静态方法,静态方法需要另外一个类的实例提供处理。在static方法里调用注入进来的service,因为是静态方法,所以必须声明该service也必须是static的,这时候发现注入不进来,会报空指针错误。

解决

在网上查阅了资料后有几种解决方案,参考http://blog.sina.com.cn/s/blog_6e2d53050102wl3x.html

@Component
public class MailUtils {
    @Autowired //注意这里非静态
    private  SysConfigService sysConfigService;
    private static MailUtils mailUtils;

    private static final Logger logger = LoggerFactory.getLogger(MailUtils.class);
    private static String SEND_USER_NAME;
    private static String SEND_USER_ADDRESS;
    private static String SEND_USER_PASSWORD;
    private static String SMTP_PORT;
    private static String SMTP_SERVER_ADDRESS;
    private static String ACCEPT_USERS_ADDRES;
    private static String ERROR_LOG_SUBJECT;

    @PostConstruct //@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行
    public void init() {
        mailUtils = this;
        mailUtils.sysConfigService = this.sysConfigService;
        //读取配置文件中的信息
        try {
            Map<String, String> sysConfigList = mailUtils.sysConfigService.findSysConfigList();
            SEND_USER_NAME = sysConfigList.get( "SEND_USER_NAME" );
            SEND_USER_ADDRESS = sysConfigList.get( "SEND_USER_ADDRESS" );
            SEND_USER_PASSWORD = sysConfigList.get( "SEND_USER_PASSWORD" );
            SMTP_PORT = sysConfigList.get( "SMTP_PORT" );
            SMTP_SERVER_ADDRESS = sysConfigList.get( "SMTP_SERVER_ADDRESS" );
            ACCEPT_USERS_ADDRES = sysConfigList.get( "ACCEPT_USERS_ADDRES" );
            ERROR_LOG_SUBJECT = sysConfigList.get( "ERROR_LOG_SUBJECT" );
        } catch(Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage(),e);
        }
    }

    //发送邮件
     public static void sendEmail(String email, String subject, String body) {
        //...
    }
}

@PostConstruct和@PreDestroy。这两个注解被用来修饰一个非静态的void()方法.被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。(注意:如果修改数据库中邮件的配置信息,项目中并不能立即生效。这个时候需要重新启动项目才行。)PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行。

还有一种解决方案时通过Spring配置文件,就不列举出来了。原理都是一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值