Spring Boot開發之流水無情(二)


 

 

 

 

http://my.oschina.net/u/1027043/blog/406558 

   

上篇散仙寫了一個很簡單的入門級的Spring Boot的例子,沒啥技術含量,不過,其實學任何東西只要找到第一個突破口,接下來的事情就好辦了,人最怕什么? 我想莫過於干一件事情,沒有下手的地方了,而當你一旦找到了這感覺,就可以很喜悅的順藤摸瓜般的探索你強烈想探索求知的某種事物了,這種冥冥之中玄而又玄的感覺是什么?回想一下: 

(1) 當你把第一個某種編程語言的Hello World的例子,成功的運行在一個IDE中 
(2) 當你第一次從老家出發到達了某個你從未涉足過的地方 
(3) 當你成功的完成了第一次網購 

一切的不相關的事物之間的,其實都有類似的學習歷程,正是所謂的觸類旁通,萬法歸宗! 

關於Spring Boot這塊,其實里面涉及的內容非常多也非常靈活,散仙的項目中用到的模塊也只是冰山一角,不可能完全覆蓋所有有關的模塊,完全是為了項目而用技術,不是為了技術而誕生了這個項目,所以這次記錄的心得,完全是項目有關的,而不是Spring Boot一個學習教程,這一點,希望各位看官明白,如果想專攻學習Spring Boot,推薦點擊官網更詳細的教程 
一個項目是由多種不同層面的技術組成的,所以散仙不會只寫有關Spring Boot方面的,雖然Spring Boot是主線。大多數情況下,都會集成多種不同的技術,只有各自發揮自己擅長的優勢,才能組合出最優的架構。 

好了,多說了點廢話,下面看下本篇記錄Spring Boot的幾個知識點: 

(一)一個Maven+Spring Boot項目基本的包結構形式 
(二)一個簡單的在Spring Boot項目集成安全控制 
(二)如何在Spring Boot中記錄log日志 
(四)Spring Boot中幾個常用注解介紹 

ok下面開始正題: 

(一)先看下,官網給出的一個簡單的包結構組成: 

Java代碼    收藏代碼
  1. com  
  2.  +- example  
  3.      +- myproject  
  4.          +- Application.java  
  5.          |  
  6.          +- domain  
  7.          |   +- Customer.java  
  8.          |   +- CustomerRepository.java  
  9.          |  
  10.          +- service  
  11.          |   +- CustomerService.java  
  12.          |  
  13.          +- web  
  14.              +- CustomerController.java  



然后,看下散仙實際工作中的項目結構: 



   


需要注意的地方如下: 
1,在src/main/java包下的第一層結構中,是必須放一個含有main方法的主啟動的類,而且只能有一個main方法,如果再出現其他的main方法,在使用maven編譯打包時,會報編譯錯誤,當然在src/test/java包下,可以出現多個,但建議最好使用Junit進行單元測試. 

這個main方法啟動,就會啟動內嵌的tomcat或jetty容器,然后加載所有需要加載的或掃描的類或資源文件。上篇博客中,散仙為了測試方便,是直接在當前的Conroller中,啟動了一個測試服務,這樣做適合單獨調試,如果是生產環境下的啟動方法,則是散仙前面所講的,在java包的根目錄下建立一個main方法類,負責啟動所有的資源。 

在本例中,散仙的main代碼如下: 

Java代碼    收藏代碼
  1. package com.dhgate.rate;  
  2.   
  3. import org.springframework.boot.SpringApplication;  
  4. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;  
  5. import org.springframework.context.annotation.ComponentScan;  
  6. import org.springframework.context.annotation.Configuration;  
  7.   
  8. @Configuration//配置控制  
  9. @EnableAutoConfiguration//啟用自動配置  
  10. @ComponentScan//組件掃描  
  11. public class ApplicationMain {  
  12.     public static void main(String[] args) throws Exception {  
  13.         //啟動Spring Boot項目的唯一入口  
  14.         SpringApplication.run(ApplicationMain.class, args);  
  15.   
  16.     }  
  17.   
  18. }  




2,在src/main/resource目錄下面,是放置一些配置文件,或模板支持的文件,如JSP,Velocity,Freemaker等,這里面比較常用或重要的一個文件,就是Spring Boot的集中式配置文件application.properties這個文件了,這里面給其他大部分的組件,提供了一個可集中管理和配置的中心,包括安全控制,redis,solr,mangodb的連接信息,以及數據庫連接池,容器端口號,jmx,java mail,動態模板等。此外這個目錄下默認是可以訪問靜態資源的,比如我們的css,js,或者第三方的一些引用文件等。 

(二)關於在Spring Boot的配置簡單的安全訪問控制,這一點非常容器,我們只需要做如下二步,即可。 
1,在pom文件中,引入spring-boot-starter-security的maven依賴。 

Xml代碼    收藏代碼
  1. <dependency>  
  2.         <groupId>org.springframework.boot</groupId>  
  3.         <artifactId>spring-boot-starter-security</artifactId>  
  4.     </dependency>  



2,在application.properties中,配置訪問的用戶名和密碼 

Java代碼    收藏代碼
  1. #用戶名 密碼配置  
  2. security.user.name=admin  
  3. security.user.password=test  



再次,訪問鏈接時,會出現以下,攔截頁面,就代表配置成功: 


 


當然這只是,一個初級的配置,更復雜的配置,可以分不用角色,在控制范圍上,能夠攔截到方法級別的權限控制。 

(三)日志的重要性,不言而喻,Spring Boot支持大部分的log配置,其中包括: 
(1)java util logging 
(2)log4j 
(3)log4j2 
(4)logbak 
默認的情況下spring boot會選擇logback作為日志記錄的載體,當然要想它正常的工作,需要依賴 Commons Logging, Java Util Logging, Log4J 或 SLF4J,相信大部分同學都是選擇使用log4j.properties作為我們的日志配置和管理,但是散仙在Spring Boot中一直沒有測試集成成功,所以就放棄使用log4j.properties作為日志載體,而是選擇了Spring Boot推薦的logbak作為日志的配置文件,用過之后感覺也不錯。 

使用步驟: 

1,將logbak.xml拷貝至resource目錄下的根目錄,然后在logbak.xml中,配置相關的log生成規則,log級別,以及日志路徑,log的字符編碼集,這個非常重要,因為剛開始用這個log記錄程序運行的信息時,發現它不支持中文log,后來經查名,需要配置相關的log編碼才可以正確記錄對應的信息。一個通用的配置如下: 

Xml代碼    收藏代碼
  1. <!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->  
  2. <configuration scan="true" scanPeriod="10 seconds">  
  3.     
  4.   <!-- Simple file output -->  
  5.   <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">  
  6.     <!-- encoder defaults to ch.qos.logback.classic.encoder.PatternLayoutEncoder -->  
  7.     <encoder>  
  8.         <pattern>  
  9.             [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n  
  10.         </pattern>  
  11.         <charset>UTF-8</charset> <!-- 此處設置字符集 -->  
  12.     </encoder>  
  13.   
  14.     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
  15.       <!-- rollover daily 配置日志所生成的目錄以及生成文件名的規則 -->  
  16.       <fileNamePattern>logs/mylog-%d{yyyy-MM-dd}.%i.log</fileNamePattern>  
  17.       <timeBasedFileNamingAndTriggeringPolicy  
  18.           class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
  19.         <!-- or whenever the file size reaches 64 MB -->  
  20.         <maxFileSize>64 MB</maxFileSize>  
  21.       </timeBasedFileNamingAndTriggeringPolicy>  
  22.     </rollingPolicy>  
  23.   
  24.   
  25.     <filter class="ch.qos.logback.classic.filter.ThresholdFilter">  
  26.       <level>DEBUG</level>  
  27.     </filter>  
  28.     <!-- Safely log to the same file from multiple JVMs. Degrades performance! -->  
  29.     <prudent>true</prudent>  
  30.   </appender>  
  31.   
  32.   
  33.   <!-- Console output -->  
  34.   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
  35.     <!-- encoder defaults to ch.qos.logback.classic.encoder.PatternLayoutEncoder -->  
  36.       <encoder>  
  37.           <pattern>  
  38.               [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n  
  39.           </pattern>  
  40.           <charset>GBK</charset> <!-- 此處設置字符集 -->  
  41.       </encoder>  
  42.     <!-- Only log level WARN and above -->  
  43.     <filter class="ch.qos.logback.classic.filter.ThresholdFilter">  
  44.       <level>WARN</level>  
  45.     </filter>  
  46.   </appender>  
  47.   
  48.   
  49.   <!-- Enable FILE and STDOUT appenders for all log messages.  
  50.        By default, only log at level INFO and above. -->  
  51.   <root level="INFO">  
  52.     <appender-ref ref="FILE" />  
  53.     <appender-ref ref="STDOUT" />  
  54.   </root>  
  55.   
  56.   <!-- For loggers in the these namespaces, log at all levels. -->  
  57.   <logger name="pedestal" level="ALL" />  
  58.   <logger name="hammock-cafe" level="ALL" />  
  59.   <logger name="user" level="ALL" />  
  60. </configuration>  




2,在application.properties中,指定log文件的加載路徑,已經配置通用的log日志級別: 

Java代碼    收藏代碼
  1. #指定log的配置文件,以及記錄Spring Boot的log級別  
  2. logging.config=logback.xml  
  3. logging.level.org.springframework.web: INFO  





(四)介紹下Spring Boot中幾個常用的注解,其中大部分都是來自Spring MVC的注解,這些注解使用的頻率一般都在90%之上。 

(1)@RestController和@Controller指定一個類,作為控制器的注解 
(2)@RequestMapping方法級別的映射注解,這一個用過Spring MVC的小伙伴相信都很熟悉 
(3)@EnableAutoConfiguration和@SpringBootApplication是類級別的注解,根據maven依賴的jar來自動猜測完成正確的spring的對應配置,只要引入了spring-boot-starter-web的依賴,默認會自動配置Spring MVC和tomcat容器 
(4)@Configuration類級別的注解,一般這個注解,我們用來標識main方法所在的類 
(5)@ComponentScan類級別的注解,自動掃描加載所有的Spring組件包括Bean注入,一般用在main方法所在的類上 
(6)@ImportResource類級別注解,當我們必須使用一個xml的配置時,使用@ImportResource和@Configuration來標識這個文件資源的類。 
(7)@Autowired注解,一般結合@ComponentScan注解,來自動注入一個Service或Dao級別的Bean 
(8)@Component類級別注解,用來標識一個組件,比如我自定了一個filter,則需要此注解標識之后,Spring Boot才會正確識別。 



ok,本篇的講解,就到此結束,這些都是項目工程的基礎知識,了解這些,有助於我們快速的上手一個Spring Boot應用。 

下篇博客的內容會寫: 
(1)如何在Spring Boot項目中集成Spring Loaded框架,來完成模塊熱加載和代碼動態編譯,有了這個東西,我們開發的效率會更加高效,大部分情況下我們改了一個類或方法的代碼之后,都不需要重啟應用,因為Spring Loaded會定時重新編譯並加載代碼。 

(2)如何在Spring Boot項目中集成Velocity,Spring Boot支持多種模板引擎,包括 
1,FreeMarker 
2,Groovy 
3,Thymeleaf 
4,Velocity 
5,JSP (Spring Boot官方不推薦) 
我們可以根據熟悉程度來選擇自己喜歡的引擎。 


免責聲明!

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



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