最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring4如何自定義@Value功能詳解

 更新時間:2017年09月06日 10:48:40   作者:西夏一品堂  
這篇文章主要給大家介紹了關(guān)于Spring4如何自定義@Value功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用spring4具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

本文主要給大家介紹了關(guān)于Spring4自定義@Value功能的相關(guān)內(nèi)容,使用的Spring版本4.3.10.RELEASE,下面話不多說了,來一起看看詳細的介紹吧。

@Value在Spring中,功能非常強大,可以注入一個配置項,可以引用容器中的Bean(調(diào)用其方法),也可以做一些簡單的運算

如下的一個簡單demo,演示@Value的用法

import org.springframework.stereotype.Service; 
 
/** 
 * 測試Bean 
 */ 
@Service("userService") 
public class UserService { 
 
 public int count() { 
  return 10; 
 } 
  
 public int max(int size) { 
  int count = count(); 
  return count > size ? count : size; 
 } 
} 
import org.springframework.beans.factory.InitializingBean; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.stereotype.Component; 
 
@Component 
public class AppRunner implements InitializingBean { 
  
 /** 
  * 引用一個配置項 
  */ 
 @Value("${app.port}") 
 private int port; 
  
 /** 
  * 調(diào)用容器的一個bean的方法獲取值 
  */ 
 @Value("#{userService.count()}") 
 private int userCount; 
  
 /** 
  * 調(diào)用容器的一個bean的方法,且傳入一個配置項的值作為參數(shù) 
  */ 
 @Value("#{userService.max(${app.size})}") 
 private int max; 
  
 /** 
  * 簡單的運算 
  */ 
 @Value("#{${app.size} <= '12345'.length() ? ${app.size} : '12345'.length()}") 
 private int min; 
  
 //測試 
 public void afterPropertiesSet() throws Exception { 
  System.out.println("port : " + port); 
  System.out.println("userCount : " + userCount); 
  System.out.println("max : " + max); 
  System.out.println("min : " + min); 
 } 
} 

app.properties

app.port=9090 
 
app.size=3 
import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.PropertySource; 
 
@ComponentScan 
@PropertySource("classpath:app.properties") 
public class App { 
  
 public static void main( String[] args) { 
  AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(App.class); 
  context.close(); 
 } 
} 

運行,輸出結(jié)果

port : 9090

userCount : 10

max : 10

min : 3

一般的用法就是這樣,用于注入一個值。

那么,能否做到,我給定一個表達式或者具體的值,它能幫忙計算出表達式的值呢? 也就是說,實現(xiàn)一個@Value的功能呢?

方法如下:

import org.springframework.beans.factory.config.BeanExpressionContext; 
import org.springframework.beans.factory.config.BeanExpressionResolver; 
import org.springframework.beans.factory.config.ConfigurableBeanFactory; 
import org.springframework.context.expression.StandardBeanExpressionResolver; 
 
public class ValueUtil { 
 
 private static final BeanExpressionResolver resolver = new StandardBeanExpressionResolver(); 
  
 /** 
  * 解析一個表達式,獲取一個值 
  * @param beanFactory 
  * @param value 一個固定值或一個表達式。如果是一個固定值,則直接返回固定值,否則解析一個表達式,返回解析后的值 
  * @return 
  */ 
 public static Object resolveExpression(ConfigurableBeanFactory beanFactory, String value) { 
  String resolvedValue = beanFactory.resolveEmbeddedValue(value); 
   
  if (!(resolvedValue.startsWith("#{") && value.endsWith("}"))) { 
   return resolvedValue; 
  } 
   
  return resolver.evaluate(resolvedValue, new BeanExpressionContext(beanFactory, null)); 
 } 
} 

具體使用如下:

import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.PropertySource; 
 
@ComponentScan 
@PropertySource("classpath:app.properties") 
public class App { 
  
 public static void main( String[] args) { 
  AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(App.class); 
  //計算一個具體的值(非表達式) 
  System.out.println(ValueUtil.resolveExpression(context.getBeanFactory(), "1121")); 
  //實現(xiàn)@Value的功能 
  System.out.println(ValueUtil.resolveExpression(context.getBeanFactory(), "${app.port}")); 
  System.out.println(ValueUtil.resolveExpression(context.getBeanFactory(), "#{userService.count()}")); 
  System.out.println(ValueUtil.resolveExpression(context.getBeanFactory(), "#{userService.max(${app.size})}")); 
  System.out.println(ValueUtil.resolveExpression(context.getBeanFactory(), "#{${app.size} <= '12345'.length() ? ${app.size} : '12345'.length()}")); 
  context.close(); 
 } 
} 

運行輸出如下:

1121

9090

10

10

3

發(fā)現(xiàn)已經(jīng)實現(xiàn)了@Value的功能

最后,可能有人就有疑問了,這有什么用呢?我直接用@Value難道不好嗎?

對于大部分場景下,的確直接用@Value就可以了。但是,有些特殊的場景,@Value做不了

比如說,我們定義一個注解

@Retention(RUNTIME) 
@Target(TYPE) 
public @interface Job { 
 String cron(); 
} 

這個注解需要一個cron的表達式,我們的需求是,使用方可以直接用一個cron表達式,也可以支持引用一個配置項(把值配置到配置文件中)

比如說

@Job(cron = "0 0 12 * * ?")
@Job(cron = "${app.job.cron}")

這種情況@Value就做不到,但是,可以用我上面的解決方案。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • SpringBoot返回html界面的使用示例

    SpringBoot返回html界面的使用示例

    本文主要介紹了SpringBoot返回html界面的使用示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • Spring Boot2配置服務(wù)器訪問日志過程解析

    Spring Boot2配置服務(wù)器訪問日志過程解析

    這篇文章主要介紹了Spring Boot2配置服務(wù)器訪問日志過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • 淺析Java.IO輸入輸出流 過濾流 buffer流和data流

    淺析Java.IO輸入輸出流 過濾流 buffer流和data流

    這篇文章主要介紹了Java.IO輸入輸出流 過濾流 buffer流和data流的相關(guān)資料,本文給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • Spring中的異步方法@Async失效的原因詳解

    Spring中的異步方法@Async失效的原因詳解

    這篇文章主要介紹了Spring中的異步方法@Async失效的原因詳解,@Async屬于異步注解,@Async放在方法上標識該方法為異步方法,異步是指進程不需要一直等待下去,而是繼續(xù)執(zhí)行下面的操作,不管其他進程的狀態(tài),需要的朋友可以參考下
    2024-01-01
  • Java解析XML的四種方法詳解

    Java解析XML的四種方法詳解

    XML現(xiàn)在已經(jīng)成為一種通用的數(shù)據(jù)交換格式,平臺的無關(guān)性使得很多場合都需要用到XML。本文將詳細介紹用Java解析XML的四種方法
    2012-10-10
  • IDEA 2021.2 激活教程及啟動報錯問題解決方法

    IDEA 2021.2 激活教程及啟動報錯問題解決方法

    這篇文章主要介紹了IDEA 2021.2 啟動報錯及激活教程,文章開頭給大家介紹了idea2021最新激活方法,關(guān)于idea2021啟動報錯的問題小編也給大家介紹的非常詳細,需要的朋友可以參考下
    2021-10-10
  • java設(shè)計模式之委派模式原理分析

    java設(shè)計模式之委派模式原理分析

    這篇文章主要介紹了java設(shè)計模式之委派模式原理分析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Java面試題沖刺第二十一天--JVM

    Java面試題沖刺第二十一天--JVM

    這篇文章主要為大家分享了最有價值的三道關(guān)于JVM的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 淺析java中Pair和Map的區(qū)別

    淺析java中Pair和Map的區(qū)別

    這篇文章主要介紹了java中Pair和Map的區(qū)別,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • JAVA hashCode使用方法詳解

    JAVA hashCode使用方法詳解

    本文詳細解釋了JAVA hashCode的使用方法,提供了測試hashCode和equals方法的使用實例
    2013-11-11

最新評論

肇州县| 饶阳县| 万源市| 诏安县| 华坪县| 天气| 敦化市| 田阳县| 梧州市| 阿克苏市| 江津市| 宝丰县| 巴林右旗| 历史| 莱西市| 旬阳县| 东宁县| 壶关县| 商丘市| 昭通市| 邯郸县| 平定县| 克什克腾旗| 东乌| 玉屏| 泊头市| 酒泉市| 麻栗坡县| 藁城市| 拉孜县| 遂宁市| 宁陵县| 霸州市| 兴仁县| 宜宾县| 乌恰县| 称多县| 兰坪| 同德县| 武隆县| 江口县|