1.打包maven項目web
1. 選中Java項目工程名稱,在菜單中選擇 File->project structure... (快捷鍵Ctrl+Alt+Shift+S)。spring
2.在彈出的窗口中左側選中"Artifacts",點擊"+"選擇jar,而後選擇"from modules with dependencies"。安全
3.在配置窗口中配置"Main Class"。選擇「Main Class」後配置「Directory for META-INF/MAINFEST.MF」,本文中選擇的項目根目錄,配置完成後以下圖所示,點擊OK進入下一步。app
4.在彈出的窗體中選中"Build On make "(make 項目的時候會自動輸出jar)框架
5.以上的步驟就完成了編譯時生成Jar包的配置,而後在菜單中選擇Build->make project 。jvm
6.build success 後,去該項目的out文件夾內查找本項目的jar包maven
OK,jar打好,下面纔是重頭戲:測試
首先說下這個jar包的用處:自動獲取當前項目的屬性值(僅是測試,功能、業務性不強)gradle
接下來,如何實現呢? 這裏要了解spring boot條件註解這個概念,有以下註解形式:ui
@ConditionalOnBean | 當容器裏有指定的Bean的條件下 |
@ConditionalOnClass | 當類路徑下有指定的class的條件下 |
@ConditionalOnExpression | 基於SpEL表達式做爲判斷條件 |
@ConditionalOnJava | 基於jvm版本做爲判斷條件 |
@ConditionalOnJndi | 在JNDI存在的條件下查找指定的位置 |
@ConditionalOnMissingBean | 當容器裏沒有指定Bean的狀況下 |
@ConditionalOnMissingClass | 當類路徑下沒有指定的類的狀況下 |
@ConditionalOnNotWebApplication | 當前項目不是web項目的狀況下 |
@ConditionalOnProperty | 指定的屬性是否有指定的值 |
@ConditionalOnResource | 類路徑下是否有指定的資源 |
@ConditionalOnSingleCandidate | 當指定的Bean在容器中只有一個,或者雖然有多個可是指定首選的Bean |
@ConditionalOnWebApplication | 當前項目是web項目的條件下 |
接下來,用標紅的註解,作個實例吧
首先是jar源的狀況:基於spring boot框架,實現類型安全讀取屬性值的功能,比較簡單,主要是整個流程可否順利走通,最終看到想要的效果,這就要
智者見智仁者見仁了,不廢話,燥起來。
基本的組織結構,揀重點 點一下
HelloServiceAutoConfiguration
1 package com.wm.auto; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 5 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 6 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 7 import org.springframework.boot.context.properties.EnableConfigurationProperties; 8 import org.springframework.context.annotation.Bean; 9 import org.springframework.context.annotation.Configuration; 10 11 12 @Configuration 13 @EnableConfigurationProperties(HelloServiceProperties.class) 14 @ConditionalOnClass(HelloService.class) 15 @ConditionalOnProperty(prefix = "hello",value ="enabled",matchIfMissing = true) 16 public class HelloServiceAutoConfiguration { 17 @Autowired 18 private HelloServiceProperties helloServiceProperties; 19 20 @Bean 21 @ConditionalOnMissingBean(HelloService.class) 22 public HelloService helloService(){ 23 HelloService helloService=new HelloService(); 24 helloService.setMsg(helloServiceProperties.getMsg()); 25 return helloService; 26 } 27 }
此處上面的判斷條件,判斷HelloService Bean是否存在,若不存在,就建立一個。
對了,還有如何作到類型安全讀取配置文件的屬性值的
HelloServiceProperties
1 package com.wm.auto; 2 3 import org.springframework.boot.context.properties.ConfigurationProperties; 4 5 6 @ConfigurationProperties(prefix="hello") 7 public class HelloServiceProperties { 8 private static final String MSG="world"; 9 private String msg=MSG; 10 11 public String getMsg() { 12 return msg; 13 } 14 15 public void setMsg(String msg) { 16 this.msg = msg; 17 } 18 19 }
spring.factories 這個是個重點,是告訴引用此jar包的項目,聲明瞭有哪些自動配置,如有多個配置,需用「,」隔開,此處的「\」是爲了換行後仍然能讀到屬性。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.wm.auto.HelloServiceAutoConfiguration
接下來就能夠打包了,這個過程當中,遇到了個問題:使用mvn install 打包到maven的本地倉庫後,引用該jar的項目是由gradle構建的,用了若干方法始終沒法被正常使用,
若某位大神 遇到過,並解決了,清指出問題的緣由,不勝感激。
最後就是引用jar包的項目介紹:
1 package com.boot; 2 3 import com.boot.properties.AuthorSetting; 4 import com.wm.auto.HelloService; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.boot.SpringApplication; 7 import org.springframework.boot.autoconfigure.SpringBootApplication; 8 import org.springframework.web.bind.annotation.RequestMapping; 9 import org.springframework.web.bind.annotation.RestController; 10 11 @RestController 12 @SpringBootApplication 13 public class Application { 14 15 @Autowired 16 public AuthorSetting authorSetting; 17 18 @Autowired 19 public HelloService helloService; 20 21 @RequestMapping("/") 22 public String index() { 23 return authorSetting.getName() + authorSetting.getAge() + "Hello Spring Boot"; 24 } 25 26 @RequestMapping("/auto-info") 27 public String autoString() { 28 return helloService.getMsg(); 29 } 30 31 public static void main(String[] args) { 32 SpringApplication.run(Application.class, args); 33 } 34 }
至此 完成,看效果