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>

然而,當一個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);

        }
        
        ...
        
    }
}

 The End.   KEEP IT SIMPLE,STUPID。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM