1. 程式人生 > 程式設計 >spring為類的靜態屬性實現注入例項方法

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);

    }
    
    ...
    
  }
}

以上就是本次知識點的全部相關程式碼,感謝大家的學習和對我們的支援。