欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring为类的静态属性实现注入

程序员文章站 2022-08-11 15:19:09
当一个java类里的静态方法需要引用一个spring资源时,我们需要定义静态属性,然后通过显示声明它们的set方法(注意,这个set方法是非静态的哦),来实现静态属性的注入。 ......

spring为类的静态属性实现注入
我们知道,正常情况下,spring的一个bean要依赖其他资源,如properties或其他bean,直接利用@value或@autowired就可以了。这两个注解就相当于spring application context xml文件定义bean时的property节点。相当于调用了每个属性的set方法。

    <bean id="person" class="com.myapp.core.spel.xml.person">  
        <property name="book" value="book" />  
        <property name="bookname" value="#{book.name}"/>  
    </bean>

spring为类的静态属性实现注入

然而,当一个java类里的静态方法需要引用一个spring资源时,我们需要定义静态属性,然后通过显示声明它们的set方法(注意,这个set方法是非静态的哦),来实现静态属性的注入。
见如下示例代码,其中dingdingreceiverman属性的set方法通过@value注解来注入一个配置“monitor_log.dingding.receiverman”;redisutil属性的set方法通过@autowired注解来注入一个bean——被@component修饰的类“redisutil”。

@component
@slf4j
public class sendwarningmessage {

    private static string dingdingreceiverman;
    private static redisutil redisutil;
    static final string acc_monitor_redis_key_prefix = "acc_monitor_";

    @value("${monitor_log.dingding.receiverman}")
    public void setdingdingreceiverman(string value) {
        dingdingreceiverman = value;
    }
    
    @autowired
    public void setredisutil(redisutil value) {
        redisutil = value;
    }
    
    public static void sendmsg(string mobile, string msg) {
    
        ...
        
        string rediskey = acc_monitor_redis_key_prefix + md5util.md5(warningmsg);
        if (redisutil.get(rediskey) != null) {
            log.info("手机号近期发过,为防止频繁发送,本次不发。 {}", mobile);
        } else {

            log.info("发送的消息:{}", warningmsg);
            dingdingutil.senddingding(dingdingreceiverman, warningmsg);
            redisutil.set(rediskey, warningmsg, 5 * 60);

        }
        
        ...
        
    }
}

spring为类的静态属性实现注入

 the end.   keep it simple,stupid。

spring为类的静态属性实现注入