1)@Configuration/@ComponentScan/@Bean註解實現java方式的配置。
@Configuration代替xml文件
@ComponentScan指定掃描範圍
@Bean代替bean標籤html
2)@Bean、@Component、 @Service、 @Repository 和 @Controller
這幾個註解的做用相似
@Bean:表示一個方法實例化、配置或者初始化一個Spring IoC容器管理的新對象。
@Component: 自動被comonent掃描。 表示被註解的類會自動被component掃描
@Repository: 用於持久層,主要是數據庫存儲庫。
@Service: 表示被註解的類是位於業務層的業務component。
@Controller:代表被註解的類是控制component,主要用於展示層 。
區別在於@Bean註解中不包含@Component註解,須要在類上顯式寫上@Component。java
@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異步方法調用web
4)Spring註解和JSR-330標準註解的區別
@Autowired=@Inject
@Component=@Named
SR-250標準註解
@Autowired=@Resourcespring
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都能獲取到此處設置的鍵值對。編程
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 串行化(對資源消耗較大,通常不使用)json
1)spring aop:代理/CGLIB
2)Aspect 用於註解class類,標明該類爲切面類,並啓用AspectJ註解,注:在使用時要同@Component一塊兒使用,不然不會被掃描到加入容器
@Pointcut 用於方法,標識方法是切入點並定義表達式
通知建言:@Before、@Around、@After、@AfterReturning、@AfterThrowing
執行順序
無異常狀況:Around->Before->本身的method->Around->After->AfterReturning
異常狀況:Around->Before->本身的method->Around->After->AfterThrowing
@EnableAspectJAutoProxy 開啓Spring對AspectJ的支持瀏覽器
Spring使用POJO(Plain Old Java Object,普通java對象)來進行企業級開發。緩存
包括:核心容器(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的支持springboot
控制反轉(Inversion of control,IOC)和依賴注入(Dependency injection,DI)在Spring中是同一律念。
控制反轉經過依賴注入實現,主要目的是實現」解耦「。
Spring Ioc容器(ApplicationContext)負責建立Bean,並將其注入。
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之間自動轉換。
1)Singleton:一個Spring容器中,只有一個Bean實例,是Spring的默認配置
2)Prototype:每次調用都建立一個Bean實例
3)Request:Web項目中,對於每一個Http Request新建一個實例
4)Session:Web項目中,對於每一個Http session新建一個實例
5)GlobalSession:在portal中起做用
Profile爲不一樣環境下使用不一樣的配置,提供支持。
eg:@Profile("dev")/@Profile("proc")/context.getEnvironment().setActiveProfiles("dev"); 指定使用開發環境配置
@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 開啓對註解緩存的支持
Spring事件(Application Event)爲Bean與Bean之間的通訊提供了支持。
Spring Aware接口能夠從Spring容器中獲取容器信息。
Spring經過在配置類中設置@EnableAsync開啓異步任務支持
在Bean方法上使用@Async註解這是一個異步任務
Spring經過在配置類中設置@EnableScheduling開啓計劃任務支持
在Bean方法上使用@Scheduled註解這是一個計劃任務。可使用cron fixDelay fixRate等。
@Conditonal條件註解
@Conditonal(*)根據是否知足條件來建立Bean
@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。
⑤測試代碼
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必須設置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); } }
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秒之內)。
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中關閉模板引擎緩存