我們知道,正常情況下,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。