1. 程式人生 > >JavaEE開發的顛覆者SpringBoot實戰摘要筆記

JavaEE開發的顛覆者SpringBoot實戰摘要筆記

開發十年,就只剩下這套架構體系了! >>>   

一、註解理解

1.spring註解

1)@Configuration/@ComponentScan/@Bean註解實現java方式的配置。
@Configuration代替xml檔案
@ComponentScan指定掃描範圍
@Bean代替bean標籤

2)@Bean、@Component、 @Service、 @Repository 和 @Controller

這幾個註解的作用類似
@Bean:表示一個方法例項化、配置或者初始化一個Spring IoC容器管理的新物件。
@Component: 自動被comonent掃描。 表示被註解的類會自動被component掃描
@Repository: 用於持久層,主要是資料庫儲存庫。
@Service: 表示被註解的類是位於業務層的業務component。
@Controller:表明被註解的類是控制component,主要用於展現層 。
區別在於@Bean註解中不包含@Component註解,需要在類上顯式寫上@Component。

@Target({ElementType.TYPE})  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
@Component  
public @interface Service {...}

3)其他
@Autowired autowire=byType 通過型別自動注入
@Qualifier    autowire=byName 型別相同時,通過指定beanid注入,類似於@Autowired 
@PropertySource注入properties等配置檔案,通過@value獲取配置檔案中的值
@PostConstruct 和 @PreDestroy 用於bean 的生命週期。類似於 init-method(InitializeingBean) destory-method(DisposableBean)
@Scope註解 作用域
@Lazy(true) 表示延遲初始化
@DependsOn:定義Bean初始化及銷燬時的順序

@Primary:自動裝配時當出現多個Bean候選者時,被註解為@Primary的Bean將作為首選者,否則將丟擲異常
spring中註解的處理基本都是通過實現介面 BeanPostProcessor 來進行的
@Async非同步方法呼叫

4)Spring註解和JSR-330標準註解的區別
@Autowired=@Inject
@Component=@Named
SR-250標準註解
@Autowired=@Resource

2.springMVC註解

1)@RequestMapping 指定URL路徑
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue")
@RequestMapping(value="/header/id", headers = "Accept=application/json")
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
value:指定請求的實際url,支援動態uri
method:指定請求的method型別, GET、POST、PUT、DELETE等;
params:指定request中必須包含某些引數值,才讓該方法處理。
headers:指定request中必須包含某些指定的header值,才能讓該方法處理請求。
consumes:指定處理請求的提交內容型別(Content-Type),例如application/json, text/html。
produces: 指定返回的內容型別,僅當request請求頭中的(Accept)型別中包含該指定型別才返回。 
2)@RequestParam 繫結request請求引數
public String requestparam4(@RequestParam(value="username",required=false) String username)
value:引數名字,即入參的請求引數名字,如username表示請求的引數區中的名字為username的引數的值將傳入;
required:是否必須,預設是true,表示請求中一定要有相應的引數,否則將丟擲異常;
defaultValue:預設值,表示如果請求中沒有同名引數時的預設值,設定該引數時,自動將required設為false。
3)@PathVariable 用於方法修飾方法引數,將修飾的方法引數變為可供使用的uri變數。

@RequestMapping(value="/users/{userId}/topics/{topicId}")  
public String test(  
       @PathVariable(value="userId") int userId,   
       @PathVariable(value="topicId") int topicId)     

4)@ModelAttribute和@SessionAttributes 
SpringMVC 支援使用 @ModelAttribute 和 @SessionAttributes 在不同的模型(model)和控制器之間共享資料。
@ModelAttribute 主要有兩種使用方式,一種是標註在方法上,一種是標註在 Controller 方法引數上。
當 @ModelAttribute 標記在方法上的時候,該方法將在處理器方法執行之前執行,然後把返回的物件存放在 session 或模型屬性中,
屬性名稱可以使用 @ModelAttribute(“attributeName”) 在標記方法的時候指定,若未指定,則使用返回型別的類名稱(首字母小寫)作為屬性名稱。
控制器中的@ModelAttribute方法是在同一控制器中的@RequestMapping方法被呼叫之前呼叫的。
一個控制器可以有任意數量的@ModelAttribute方法.
5)@Responsebody與@RequestBody
@Responsebody表示該方法的返回結果直接寫入HTTP response body中。一般在非同步獲取資料時使用
@RequestBody該註解用於讀取Request請求的body部分資料,使用系統預設配置的HttpMessageConverter進行解析,然後把相應的資料繫結到要返回的物件上;
6)@RestController
組合了@Controller和@ResponseBody,常用於restful介面
@EnableWebMvc
註解會開啟一些預設配置,如一些ViewResolver或者MessageConverter等。
7)@ControllerAdvice
通過@ControllerAdvice,我們可以把控制器的全域性配置放置在同一個位置,
如:@ExceptionHandler、@InitBinder、@ModelAttribute.
這對註解了@Controller的類有效。
@ExceptionHandler 用於處理器全域性異常
@InitBinder 用來設定WebDataBinder,自動繫結前臺請求引數到Model中
@ModelAttribute 本來的作用是繫結鍵值對到Model裡,此處是讓全域性的@RequestMapping都能獲取到此處設定的鍵值對。

3.@Transactional事務模組註解

eg:@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
1)propagation 事務傳播行為型別
PROPAGATION_REQUIRED    如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
PROPAGATION_SUPPORTS    支援當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY    使用當前的事務,如果當前沒有事務,就丟擲異常。
PROPAGATION_REQUIRES_NEW    新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED    以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER    以非事務方式執行,如果當前存在事務,則丟擲異常
PROPAGATION_NESTED    如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類 似的操作
2)readOnly事務只讀 預設false
3)rollbackFor 回滾策略,當遇到指定異常時回滾。
4)timeout 超時時間,秒
5)isolation 事務隔離級別
DEFAULT    採用資料庫預設隔離級別
READ_UNCOMMITTED    讀未提交的資料(會出現髒讀取)
READ_COMMITTED    讀已提交的資料(會出現幻讀,即前後兩次讀的不一樣)
REPEATABLE_READ    可重複讀,會出現幻讀
SERIALIZABLE    序列化(對資源消耗較大,一般不使用)

4.AOP相關注解

spring aop模組的註解主要有
Aspect 用於註解class類,標明該類為切面類,並啟用AspectJ註解,注:在使用時要同@Component一起使用,否則不會被掃描到加入容器
@Pointcut 用於方法,標識方法是切入點並定義表示式
通知建言:@Before、@Around、@After、@AfterReturning、@AfterThrowing
@EnableAspectJAutoProxy 開啟Spring對AspectJ的支援

二、Spring概要

1.POJO

Spring使用POJO(Plain Old Java Object,普通java物件)來進行企業級開發。

2.Spring組成

包括:核心容器(Core Container)、AOP、訊息Messaging、Web、資料訪問等部分組成
1)核心容器(Core Container)
Spring-Core:核心工具類
Spring-Bean:Bean支援
Spring-Context:執行時spring容器
Spring-Context-Support:Spring容器對第三方包的整合支援
Spring-Expressing:SPEL表示式
2)AOP
Spring-AOP:基於代理的AOP支援
Spring-Aspects:基於AspectJ的AOP支援
3)Messaging訊息
Spring-Messaging:對訊息架構和協議的支援
4)Web
Spring-Web:提供基礎的web整合功能,在web專案中提供spring支援
Spring-WebMVC:提供基於Servlet的Spring MVC
Spring-WebSocket:提供WebSocket功能
Spring-WebMVC-Portlet:提供Portlet環境支援
5)資料訪問/整合
Spring-JDBC:提供JDBC支援
Spring-TX:提供對程式設計式事務和宣告式事務的支援
Spring-ORM:提供對 物件/關係 的對映支援
Spring-OXM:提供對 物件/xml 的對映支援
Spring-JMS:提供對JMS的支援

3.IOC/DI

控制反轉(Inversion of control,IOC)和依賴注入(Dependency injection,DI)在Spring中是同一概念。
控制反轉通過依賴注入實現,主要目的是實現”解耦“。
Spring Ioc容器(ApplicationContext)負責建立Bean,並將其注入。

4.AOP

1)AspectJ應用到java程式碼的過程(這個過程稱為織入),對於織入這個概念,可以簡單理解為aspect(切面)應用到目標函式(類)的過程。
對於這個過程,一般分為動態織入和靜態織入,動態織入的方式是在執行時動態將要增強的程式碼織入到目標類中,這樣往往是通過動態代理技術完成的,
如Java JDK的動態代理(Proxy,底層通過反射實現)或者CGLIB的動態代理(底層通過繼承實現),Spring AOP採用的就是基於執行時增強的代理技術.
ApectJ採用的就是靜態織入的方式,即編譯期織入,Spring沒有采用這種方式。
2)Spring的兩種動態代理:Jdk和Cglib
java動態代理是利用反射機制生成一個實現代理介面的匿名類,在呼叫具體方法前呼叫InvokeHandler來處理。
而cglib動態代理是利用asm開源包,對代理物件類的class檔案載入進來,通過修改其位元組碼生成子類來處理。
因為cglib是繼承,所以該類或方法最好不要宣告成final 。
a.如果目標物件實現了介面,預設情況下會採用JDK的動態代理實現AOP 
b.如果目標物件實現了介面,可以強制使用CGLIB實現AOP 
c.如果目標物件沒有實現了介面,必須採用CGLIB庫,spring會在JDK動態代理和CGLIB之間自動轉換。

5.Scope種類

1)Singleton:一個Spring容器中,只有一個Bean例項,是Spring的預設配置
2)Prototype:每次呼叫都建立一個Bean例項
3)Request:Web專案中,對於每個Http Request新建一個例項
4)Session:Web專案中,對於每個Http session新建一個例項
5)GlobalSession:在portal中起作用

6.Profile

Profile為不同環境下使用不同的配置,提供支援。
eg:@Profile("dev")/@Profile("proc")/context.getEnvironment().setActiveProfiles("dev"); 指定使用開發環境配置

7.@Enable*註解

@Enable*的實質是通過@import註解引入配置類

    @Target(ElementType.TYPE)  
    @Retention(RetentionPolicy.RUNTIME)  
    @Import(SchedulingConfiguration.class)  
    @Documented  
    public @interface EnableScheduling {  
    }  

@EnableAspectJAutoProxy 開啟對AspectJ的支援
@EnableAsync 開啟對非同步方法的支援
@EnableScheduling 開啟對計劃任務的支援
@EnableWebMvc 開啟對webMvc的支援
@EnableConfigurationProperties 開啟對@ConfigurationProperties註解配置bean的支援
@EnableJpaRepositories開啟對Spring Data JPA Repository的支援
@EnableTransactionManagement 開始對註解事務的支援
@EnableCaching 開啟對註解快取的支援

8.其他

Spring事件(Application Event)為Bean與Bean之間的通訊提供了支援。
Spring Aware介面可以從Spring容器中獲取容器資訊。
Spring通過在配置類中設定@EnableAsync開啟非同步任務支援
在Bean方法上使用@Async註解這是一個非同步任務
Spring通過在配置類中設定@EnableScheduling開啟計劃任務支援
在Bean方法上使用@Scheduled註解這是一個計劃任務。可以使用cron fixDelay fixRate等。
@Conditonal條件註解
@Conditonal(*)根據是否滿足條件來建立Bean

9.Spring測試支援

@RunWith/@ContextConfiguration/@ActiveProfiles

@RunWith(SpringJUnit4ClassRunner.class) //1  
@ContextConfiguration(classes = {TestConfig.class}) //2  
@ActiveProfiles("prod") //3  
public class DemoBeanIntegrationTests {  
    @Autowired //4  
    private TestBean testBean;  
    @Test //5  
    public void prodBeanShouldInject(){  
        String expected = "from production profile";  
        String actual = testBean.getContent();Assert.assertEquals(expected, actual);  
    }  
}  

①SpringJUnit4ClassRunner在JUnit環境下提供
Spring TestContext Framework的功能。
②@ContextConfiguration用來載入配置
ApplicationContext, 其中classes屬性用來載入配置類。
③@ActiveProfiles用來宣告活動的profile。
④可使用普通的@Autowired注入Bean。
⑤測試程式碼

三、SringMVC概要

1.在Servlet 2.5及以下的時候只要在web.xml下配置<servlet>元素,指定DispatcherServlet即可
2.在Servlet3.0+無web.xml時,需要實現WebApplicationInitializer介面
3.伺服器端推送技術
客戶端向服務端傳送請求,服務端會抓住這個請求不放,等有資料更新的時候才返回給客戶端;
當客戶端接收到訊息後,再向服務端傳送請求,周而復始。這種方式的好處是減少了伺服器的請求數量,大大減少了伺服器的壓力。
@RequestMapping(value="/push",produces="text/eventstream")
這裡使用輸出的媒體型別為text/eventstream,這是伺服器端SSE(Server Send Event服務端傳送事件)的支援。
4.測試支援
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {MyMvcConfig.class})
@WebAppConfiguration("src/main/resources")
public class TestControllerIntegrationTests {...}
5.工作過程
第1步:瀏覽器傳送指定的請求都會交給DispatcherServlet,他會委託其他模組進行真正的業務和資料處理 
第2步:DispatcherServlet會查詢到HandleMapping,根據瀏覽器的請求找到對應的Controller,並將請求交給目標Controller 
第3步:目標Controller處理完業務後,返回一個ModelAndView給DispatcherServlet 
第4步:DispatcherServlet通過ViewResolver檢視解析器找到對應的檢視物件View 
第5步:檢視物件View負責渲染,並返回到瀏覽器

四、springboot要點

1.配置

springboot必須設定parent為springboot的parent,引入springboot預設配置。  
    <parent>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-parent</artifactId>  
        <version>1.5.2.RELEASE</version>  
        <relativePath></relativePath>  
    </parent>  
引入web支援  
        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-web</artifactId>  
        </dependency>  
新增springboot外掛  
        <plugins>  
            <plugin>  
                <groupId>org.springframework.boot</groupId>  
                <artifactId>spring-boot-maven-plugin</artifactId>  
            </plugin>  
        </plugins>  
建立啟動類  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;  
import org.springframework.context.annotation.ComponentScan;  
import org.springframework.context.annotation.Configuration;

@Configuration  
@EnableAutoConfiguration  
@ComponentScan  
public class Application {  
      public static void main(String\[\] args) {  
          SpringApplication.run(Application.class, args);  
      }  
        
}  

2.除錯外掛

1)springloader
a.外掛方式 只對後臺程式碼起作用(不需要重啟,真正的熱部署),對前臺jsp的修改不起作用。
                  是以後臺程序的方式工作的,需要在工作管理員中手動殺掉javaw.exe

<plugin>  
	<groupId>org.springframework.boot</groupId>  
	<artifactId>spring-boot-maven-plugin</artifactId>  
	<dependencies>    
		<dependency>    
			<groupId>org.springframework</groupId>    
			<artifactId>springloaded</artifactId>    
			<version>1.2.4.RELEASE</version>  
		</dependency>    
	</dependencies>    
	<executions>    
		<execution>    
			<goals>    
				<goal>repackage</goal>    
			</goals>    
			<configuration>    
				<classifier>exec</classifier>    
			</configuration>    
		</execution>    
	</executions>  
</plugin>  

b.在專案中引入springloader的jar包,新增VM啟動引數。
2)devtools 對java檔案的修改會重啟服務,jsp不會重啟。

        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-devtools</artifactId>  
        </dependency>  

devtools使用了兩個ClassLoader,一個Classloader載入那些不會改變的類(第三方Jar包),另一個ClassLoader載入會更改的類,稱為 restart ClassLoader 
,這樣在有程式碼更改的時候,原來的restart ClassLoader 被丟棄,重新建立一個restart ClassLoader,由於需要載入的類相比較少,所以實現了較快的重啟時間(5秒以內)。

3.簡介

1)SpringBoot專案只需通過java–jar xx.jar來執行。工程中可使用mvn spring-boot:run執行
2)SpringBoot CLI是Spring Boot提供的控制檯命令工具,用於生成基本工程,Springboot提供了大量的starter來簡化配置。
3)@SpringBootApplication是Spring Boot專案的核心註解,主要目的是開啟自動配置。
實質:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {
    Class<?>[] exclude() default {};
    String[] excludeName() default {};
}
4)@EnableAutoConfiguration讓Spring Boot根據類路徑中的jar包依賴為當前專案進行自動配置。
Spring Boot會自動掃描@SpringBootApplication所在類的同級包及下級包裡的Bean.
使用@SpringBootApplication註解的exclude引數可以關閉自動配置。
@SpringBootApplication(exclude ={DataSourceAutoConfiguration.class})
5)src/main/resources下新建一個banner.txt,可以設定個性化的啟動logo。
http://patorjk.com/software/taag
6)我們可以通過Spring提供的@ImportResource來載入xml配置
@ImportResource({"classpath:somecontext.xml","classpath:another-context.xml"})
7)SpringBoot預設使用Logback作為日誌框架。
通過在application.properties中設定spring.profiles.active=prod來指定活動的Profile。
8)@EnableAutoConfiguration

@Target(ElementType.TYPE)  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
@Inherited  
@Import({ EnableAutoConfigurationImportSelector.class,AutoConfigurationPackages.Registrar.class })  
public @interface EnableAutoConfiguration {  
    Class<?>\[\] exclude() default {};  
    String\[\] excludeName() default {};  
}  

使用@Import註解匯入配置。
EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames方法來掃描具有
META-INF/spring.factories檔案的jar包, 而的spring-boot-autoconfigure-1.3.0.x.jar裡就有一個
spring.factories檔案, 此檔案中聲明瞭有哪些自動配置。

@ConditionalOnBean: 當容器裡有指定的Bean的條件下。
@ConditionalOnClass: 當類路徑下有指定的類的條件下。
@ConditionalOnExpression: 基於SpEL表示式作為判斷條件。
@ConditionalOnJava: 基於JVM版本作為判斷條件。
@ConditionalOnJndi: 在JNDI存在的條件下查詢指定的位置。
@ConditionalOnMissingBean: 當容器裡沒有指定Bean的情況下。
@ConditionalOnMissingClass: 當類路徑下沒有指定的類的條件下。
@ConditionalOnNotWebApplication: 當前專案不是Web專案的條件下。
@ConditionalOnProperty: 指定的屬性是否有指定的值。
@ConditionalOnResource: 類路徑是否有指定的值。
@ConditionalOnSingleCandidate: 當指定Bean在容器中只有一個, 或者雖然有多個但是指定首選的Bean。
@ConditionalOnWebApplication: 當前專案是Web專案的條件下。
9)SpringBoot推薦使用Thymeleaf作為模板引擎.
在Spring Boot裡,模板引擎的頁面預設是開啟快取的,如果修改了頁面的內容,則重新整理頁面是得不到修改後的頁面的.
因此,我們可以在application.properties中關