1、註解(annotations)列表
@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration註解。其中:@ComponentScan讓SpringBoot掃描到Configuration類並把它加入到程序上下文。
@Configuration 等同於spring的XML配置文件;使用Java代碼能夠檢查類型安全。
@EnableAutoConfiguration 自動配置。
@ComponentScan 組件掃描,可自動發現和裝配一些Bean。
@Component可配合CommandLineRunner使用,在程序啓動後執行一些基礎任務。
@RestController註解是@Controller和@ResponseBody的合集,表示這是個控制器bean,而且是將函數的返回值直接填入HTTP響應體中。
@Autowired自動注入。
@PathVariable獲取參數。
@JsonBackReference解決嵌套外鏈問題。
@RepositoryRestResourcepublic配合spring-boot-starter-data-rest使用。html
2、註解(annotations)詳解
@SpringBootApplication:申明讓spring boot自動給程序進行必要的配置,這個配置等同於:@Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三個配置。web
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication//@Configuration,@EnableAutoConfiguration,@ComponentScan public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
@RequestMapping:提供路由信息,負責URL到Controller中的具體函數的映射。
@Controller:用於定義控制器類,在spring 項目中由控制器負責將用戶發來的URL請求轉發到對應的服務接口(service層),通常這個註解在類中,一般方法須要配合註解@RequestMapping。
示例代碼:spring
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; /** * 計劃在這個controller中處理全部頁面請求 * @author ldjx */ @Controller @RequestMapping("/") public class PageController { //返回項目的首頁頁面 @RequestMapping("doIndexUI") public String doIndexUI() { return "index"; } }
@ResponseBody:表示該方法的返回結果直接寫入HTTP response body中,通常在異步獲取數據時使用。在使用@RequestMapping後,返回值一般解析爲跳轉路徑,加上@responsebody後返回結果不會被解析爲跳轉路徑,而是直接寫入HTTP response body中。好比異步獲取json數據,加上@responsebody後,會直接返回json數據。該註解通常會配合@RequestMapping一塊兒使用。示例代碼:sql
@RequestMapping(「/test」) @ResponseBody public String test(){ return」ok」; }
或者返回自定義的類型,如使用JsonResult類對數據結果進行封裝:數據庫
@RequestMapping("/testDelete") @ResponseBody public JsonResult doDeleteObject(Integer id){ //to delete... return new JsonResult("delete ok"); }
@RestController:用於標註控制層組件(如struts中的action),@ResponseBody和@Controller的合集。
示例代碼:編程
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.cy.pj.common.pojo.JsonResult; import com.cy.pj.sys.service.SysLogService; /** * 儘可能將返回頁面的請求處理與數據處理的controller分開 * 只處理頁面返回請求的使用@controller便可,將@RestController使用在返回數據處理的controller上 * 避免了每一個方法上都加@ResponseBody的麻煩 * @author ldjx */ @RestController //至關於@ResponseBody + @Controller @RequestMapping("/test/") public class SysLogController { @Autowired private TestService testService; @RequestMapping("doDeleteObject") public JsonResult doDeleteObjects(Integer id) { //調用業務方法執行刪除操做...( testService.doDelete(id) ) return new JsonResult("delete ok"); } @RequestMapping("doFindObjects") public JsonResult doFindPageObjects(){ return new JsonResult(testService.findObjects());//業務層返回的數據封裝在JsonResult對象中 }
@EnableAutoConfiguration:Spring Boot自動配置(auto-configuration):嘗試根據你添加的jar依賴自動配置你的Spring應用。例如,若是你的classpath下存在HSQLDB,而且你沒有手動配置任何數據庫鏈接beans,那麼咱們將自動配置一個內存型(in-memory)數據庫」。你能夠將@EnableAutoConfiguration或者@SpringBootApplication註解添加到一個@Configuration類上來選擇自動配置。若是發現應用了你不想要的特定自動配置類,你可使用@EnableAutoConfiguration註解的排除屬性來禁用它們。
@ComponentScan:表示將該類自動發現掃描組件。我的理解至關於,若是掃描到有@Component、@Controller、@Service等這些註解的類,並註冊爲Bean,能夠自動收集全部的Spring組件,包括@Configuration類。咱們常用@ComponentScan註解搜索beans,並結合@Autowired註解導入。能夠自動收集全部的Spring組件,包括@Configuration類。咱們常用@ComponentScan註解搜索beans,並結合@Autowired註解導入。若是沒有配置的話,Spring Boot會掃描啓動類所在包下以及子包下的使用了@Service,@Repository等註解的類。
@Configuration:至關於傳統的xml配置文件,若是有些第三方庫須要用到xml文件,建議仍然經過@Configuration類做爲項目的配置主類——可使用@ImportResource註解加載xml配置文件。
@Import:用來導入其餘配置類。
@ImportResource:用來加載xml配置文件。
@Service:通常用於修飾service層的組件
@Repository:使用@Repository註解能夠確保DAO或者repositories提供異常轉譯,這個註解修飾的DAO或者repositories類會被ComponetScan發現並配置,同時也不須要爲它們提供XML配置項。
@Value:注入Spring boot application.properties配置的屬性的值。示例代碼:
@Value(value = "#{message}") private String message;
@Inject:等價於默認的@Autowired,只是沒有required屬性;
@Component:泛指組件,當組件很差歸類的時候,咱們可使用這個註解進行標註。
@Bean:用@Bean標註方法等價於XML中配置的bean,放在方法的上面,而不是類,告訴Spring容器,你能夠從下面這個方法中拿到一個Bean。
示例代碼:json
public class ObjectTest{ } //------------------------------------------------------------------------------ /* * @Bean 註解一般會應用在一些配置類(由@Configuration註解描述)中,用於描述 * 具有返回值的方法,而後系統底層會經過反射調用其方法,獲取對象基於做用域將對象 * 進行存儲或應用。 * @Bean 應用場景:第三方資源的整合及配置。 */ //@Bean("obj") //爲返回值指定名字 @Bean //Spring容器中由@Bean描述的方法的返回值,對應的名字默認爲方法名 public ObjectTest testObj() { return new ObjectTest(); }
@AutoWired:自動注入依賴的bean。byType方式。把配置好的Bean拿來用,完成屬性、方法的組裝,它能夠對類成員變量、方法及構造函數進行標註,完成自動裝配的工做。當加上(required=false)時,就算找不到bean也不報錯。
@Qualifier:當有多個同一類型的Bean時,能夠用@Qualifier(「name」)來指定。與@Autowired配合使用。@Qualifier限定描述符除了能根據名字進行注入,但能進行更細粒度的控制如何選擇候選者,具體使用方式以下:緩存
public interface TestQua { } //---------------------------------------------------------------------------------------------------------- public class QuaImpl01 implements TestQua{ } //---------------------------------------------------------------------------------------------------------- public class QuaImpl02 implements TestQua{ } //---------------------------------------------------------------------------------------------------------- @SpringBootTest//該註解用於SpringBoot項目中的測試類 public class CacheTest { //@Autowired註解描述屬性時,系統底層會基於屬性類型從spring容器查找對象,假若有多個類型都知足注入要求,則還會基於屬性名進行查找,檢測哪一個bean名字與屬性相同,假若有相同的則直接取相同進行注入,沒有則拋出異常 @Autowired //@Qualifier註解配合@Autowired註解使用,用於指定將哪一個bean的名字對應的對象注入給描述的屬性 //@Qualifier("quaImpl01") @Qualifier("quaImpl02") private TestQua testQua; @Test void testCache() { System.out.println("testQua="+testQua); } }
@Resource(name="name",type="type"):沒有括號內內容的話,默認byName。與@Autowired幹相似的事。
@Lazy:描述Spring管理的bean對象時,可讓bean延遲構建和初始化.
延遲加載(懶加載,按需加載)應用場景:安全
大對象(例如一些池對象),稀少用(例如容器初始化時建立了對象也用不到).
@Scope:描述類時用於指定類實例的做用域,經常使用取值:架構
@PostConstruct:此註解描述的方法爲生命週期初始化方法.
@PreDestroy:此註解描述的方法爲生命週期銷燬方法,此方法會在對象銷燬以前執行(若是是多例做用域,則不會觸發此方法).
示例代碼:
@Scope //spring容器中的bean沒有使用@Scope註解描述時默認就是單例. //@Scope("prototype") @Lazy //默認value屬性值爲true,表示此對象要延遲構建及初始化. //@Lazy(false)//這裏假如要寫false,跟沒有寫@Lazy註解是同樣的,表示不支持對象延遲構建及初始化. @Component //此註解描述bean表示這個bean對象會由spring建立,其名字默認爲類名,首字母小寫. public class ObjectPool {//bean的名字objectPool public int size; public ObjectPool() {//使用lazy註解後,啓動項目未觸發構造方法,說明沒有建立此對象(延遲加載生效) System.out.println("ObjectPool()"); } /** * @PostConstruct 此註解描述的方法爲生命週期初始化方法 * 在這樣的方法中通常會爲建立好的對象再此進行一些初始化. */ @PostConstruct public void init() { System.out.println("init()"); } /** *@PreDestroy 此註解描述的方法爲生命週期銷燬方法,此方法會在對象銷燬以前執行. * 在這樣的方法中能夠實現一些,資源銷燬操做. */ @PreDestroy public void destory() {//將對象從bean池中移除以前會執行此方法 System.out.println("destory()"); } }
3、JPA註解
@Entity:@Table(name=""):代表這是一個實體類。通常用於jpa這兩個註解通常一塊使用,可是若是表名和實體類名相同的話,@Table能夠省略
@MappedSuperClass:用在肯定是父類的entity上。父類的屬性子類能夠繼承。
@NoRepositoryBean:通常用做父類的repository,有這個註解,spring不會去實例化該repository。
@Column:若是字段名與列名相同,則能夠省略。
@Id:表示該屬性爲主鍵。
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "repair_seq"):表示主鍵生成策略是sequence(能夠爲Auto、IDENTITY、native等,Auto表示可在多個數據庫間切換),指定sequence的名字是repair_seq。
@SequenceGeneretor(name = "repair_seq", sequenceName = "seq_repair", allocationSize = 1):name爲sequence的名稱,以便使用,sequenceName爲數據庫的sequence名稱,兩個名稱能夠一致。
@Transient:表示該屬性並不是一個到數據庫表的字段的映射,ORM框架將忽略該屬性。若是一個屬性並不是數據庫表的字段映射,就務必將其標示爲@Transient,不然,ORM框架默認其註解爲@Basic。@Basic(fetch=FetchType.LAZY):標記能夠指定實體屬性的加載方式
@JsonIgnore:做用是json序列化時將Javabean中的一些屬性忽略掉,序列化和反序列化都受影響。
@JoinColumn(name=」loginId」):一對一:本表中指向另外一個表的外鍵。一對多:另外一個表指向本表的外鍵。
@OneToOne、@OneToMany、@ManyToOne:對應hibernate配置文件中的一對一,一對多,多對一。
4、springMVC相關注解
@RequestMapping:@RequestMapping("/path")表示該控制器處理全部"/path"的UR L請求。RequestMapping是一個用來處理請求地址映射的註解,可用於類或方法上。
用於類上,表示類中的全部響應請求的方法都是以該地址做爲父路徑。該註解有六個屬性:
@RequestParam:用在方法的參數前面。示例代碼:
@RequestMapping("/test") public String test(int userId) {//當不使用@RequestParam註解時,參數爲非必傳 return "test"; } //===========================================分隔線=============================================== @RequestMapping("/test") public String test(@RequestParam Integer id) {//當使用@RequestParam註解時,參數爲必傳,且參數名爲id return "test"; } //===========================================分隔線=============================================== @RequestMapping("/list") public String test(@RequestParam(value = "userId", defaultValue = "0", required = false) int userId) { /* * value值即請求參數的參數名; * required該參數是否必須。默認爲true,因此默認必傳; * defaultValue請求參數的默認值 */ return "list"; }
@PathVariable:路徑變量。如
//rest風格(軟件架構編碼風格,這個風格中url的定義容許使用{}做爲變量)的URL //rest風格的url優點: //1)能夠更通用 //2)能夠在異構平臺下進行兼容 @RequestMapping("sys/{moduleUI}") public String doModuleUI(@PathVariable String moduleUI) { return "sys/"+moduleUI; }
參數與大括號裏的名字同樣要相同。
5、全局異常處理
@ControllerAdvice:包含@Component。能夠被掃描到。統一處理異常。
@ExceptionHandler(Exception.class):用在方法上面表示遇到這個異常就執行如下方法。
示例代碼:
/** * @ControllerAdvice 註解描述的類爲spring web(MVC)控制層的一個全局異常處理對象,當控制層出現異常之後,首先會檢 * 測控制層類中是否有異常處理方法,假如沒有或者不能處理當前異常,則會查找是否有@ControllerAdvice註解描述的類, * 而後檢測全局異常處理類中是否有合適的異常處理方法.假如若有則直接調用方法處理異常. * * 爲何要作全局異常處理?(提取共性) */ @ControllerAdvice public class GlobalExceptionHandler { /** * @ExceptionHandler 註解描述的方法爲一個異常處理方法,註解中定義的 * 異常類型,爲當前方法的能夠處理的異常處理類型(固然也能夠處理異常類型的子類類 * 型).在異常處理方法中一般會定義一個異常參數,來接收異常對象. */ @ExceptionHandler(RuntimeException.class) @ResponseBody public JsonResult doHandleRuntimeException(RuntimeException e) { return new JsonResult(e);//使用自定義JsonResult類對異常信息進行封裝 } }
6、AOP註解(AspectJ框架)
@Aspect 註解用於標識或者描述AOP中的切面類型,基於切面類型構建的對象用於爲目標對象進行功能擴展或控制目標對象的執行。
@Pointcut註解用於描述切面中的方法,並定義切面中的切入點(基於特定表達式的方式進行描述):
bean表達式:
bean表達式通常應用於類級別,實現粗粒度的切入點定義,案例分析:
說明:bean表達式內部的對象是由spring容器管理的一個bean對象,表達式內部的名字應該是spring容器中某個bean的name.
within表達式:
within表達式應用於類級別,實現粗粒度的切入點表達式定義,案例分析:
within表達式應用場景分析:
execution表達式:
execution表達式應用於方法級別,實現細粒度的切入點表達式定義,案例分析:
語法:execution(返回值類型 包名.類名.方法名(參數列表)).
@annotation表達式:
@annotaion表達式應用於方法級別,實現細粒度的切入點表達式定義,案例分析
其中:RequiredTest爲咱們本身定義的註解,當咱們使用@RequiredTest註解修飾業務層方法時,系統底層會在執行此方法時進行咱們自定義的切面業務擴展操做(如自動將日誌信息添加至數據庫等操做)。
@Around註解用於描述切面中方法,這樣的方法會被認爲是一個環繞通知(核心業務方法執行以前和以後要執行的一個動做),@Aournd註解內部value屬性的值爲一個切入點表達式或者是切入點表達式的一個引用(這個引用爲一個@PointCut註解描述的方法的方法名)。
ProceedingJoinPoint類爲一個鏈接點類型,此類型的對象用於封裝要執行的目標方法相關的一些信息。只能用於@Around註解描述的方法參數。
AOP編程的過程當中,基於AspectJ框架標準,spring中定義了五種類型的通知(通知描述的是一種擴展業務),它們分別是:
@Before
@AfterReturning
@AfterThrowing
@After
@Around(優先級最高)
假如這些通知所有寫到一個切面對象中,其執行順序及過程以下:
測試代碼:
@Component @Aspect public class TestAspect { @Pointcut("bean(*ServiceImpl)")//表示匹配後綴爲ServiceImpl的全部對象 public void doTime(){} @Before("doTime()") public void doBefore(JoinPoint jp){ System.out.println("time doBefore()"); } @After("doTime()") public void doAfter(){ System.out.println("time doAfter()"); } @AfterReturning("doTime()") public void doAfterReturning(){ System.out.println("time doAfterReturning"); } @AfterThrowing("doTime()") public void doAfterThrowing(){ System.out.println("time doAfterThrowing"); } @Around("doTime()") public Object doAround(ProceedingJoinPoint jp)throws Throwable{ System.out.println("doAround.before"); try{ Object obj = jp.proceed(); System.out.println("doAround.after"); return obj; }catch(Throwable e){ System.out.println(e.getMessage()); throw e; } } }
對於@AfterThrowing通知只有在出現異常時纔會執行,因此當作一些異常監控時可在此方法中進行代碼實現
@Order註解用於描述切面的優先級,數字越小優先級越高,默認值爲整型的最大值,因此默認優先級比較低。
例如:
//定義日誌切面並指定優先級。 @Order(1) @Aspect @Component public class SysLogAspect { } //定義緩存切面並指定優先級: @Order(2) @Aspect @Component public class SysCacheAspect { //do something… }
Spring AOP事務處理
基於@Transactional 註解進行聲明式事務管理的實現步驟分爲兩步:
其代碼示例以下:
@Transactional(timeout = 30,readOnly = false,isolation = Isolation.READ_COMMITTED, rollbackFor = Throwable.class,propagation = Propagation.REQUIRED) @Service public class SysUserServiceImpl implements SysUserService { @Transactional(readOnly = true) @Override public PageObject<SysUserDeptVo> findPageObjects(String name, Integer pageCurrent) { //do something… } }
其中,代碼中的@Transactional註解用於描述類或方法,告訴spring框架咱們要在此類的方法執行時進行事務控制,其具體說明以下:
@Transactional 經常使用屬性應用說明:
Spring 業務的異步實現
在基於註解方式的配置中,藉助@EnableAsync註解進行異步啓動聲明,Spring Boot版的項目中,將@EnableAsync註解應用到啓動類上,代碼示例以下:
@EnableAsync //spring容器啓動時會建立線程池 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
在須要異步執行的業務方法上,使用@Async方法進行異步聲明。
@Async @Transactional(propagation = Propagation.REQUIRES_NEW) @Override public void saveObject(SysLog entity) { System.out.println("SysLogServiceImpl.save:"+Thread.currentThread().getName()); sysLogDao.insertObject(entity); //try{Thread.sleep(5000);}catch(Exception e) {} }
假如須要獲取業務層異步方法的執行結果,可參考以下代碼設計進行實現:
@Transactional(propagation = Propagation.REQUIRES_NEW) @Async @Override public Future<Integer> saveObject(SysLog entity) { System.out.println("SysLogServiceImpl.save:"+Thread.currentThread().getName()); int rows=sysLogDao.insertObject(entity); //try{Thread.sleep(5000);}catch(Exception e) {} return new AsyncResult<Integer>(rows); }
其中,AsyncResult對象能夠對異步方法的執行結果進行封裝,假如外界須要異步方法結果時,能夠經過Future對象的get方法獲取結果。
當咱們須要本身對spring框架提供的鏈接池進行一些簡易配置,能夠參考以下代碼:
spring: task: execution: pool: queue-capacity: 128 core-size: 5 max-size: 128 keep-alive: 60000 thread-name-prefix: service-task-
Spring 中業務緩存應用實現
啓動緩存配置
在項目(SpringBoot項目)的啓動類上添加@EnableCaching註解,以啓動緩存配置。代碼以下:
//@EnableCaching 註解表示啓動緩存配置 @EnableCaching @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
業務方法上應用緩存配置
在須要進行緩存的業務方法上經過@Cacheable註解對方法進行相關描述.表示方法的返回值要存儲到Cache中,假如在更新操做時須要將cache中的數據移除,能夠在更新方法上使用@CacheEvict註解對方法進行描述:
@Cacheable(value = "menuCache") @Transactional(readOnly = true) public List<Map<String,Object>> findObjects() { //.... }
其中,value屬性的值表示要使用的緩存對象,名字本身指定,其中底層爲一個map對象,當向cache中添加數據時,key默認爲方法實際參數的組合。
第二步:在相關模塊更新時,清除指定緩存數據,代碼以下:
@CacheEvict(value="menuCache",allEntries=true) @Override public int saveObject(SysDept entity) {...}
其中,allEntries表示清除全部。
文中部份內容摘自:www.cnblogs.com/tanwei81/p/6814022.html --做者:tanwei81