爲了方便咱們在平常開發註解的使用,本文將開發所須要的註解統一併進行歸類起來,並結合用例進行解析,這樣收藏起來以便往後使用。最主要本文將持續更新平常使用的註解,也能夠評論中告知其餘註解。java
@component,而其他 @Controller、@Service、@Repository都組合了@component註解,主要爲便於使用者Class組件進行歸類。默認加載IOC容器中的組件,容器啓動會調用無參構造器建立對象,再進行初始化賦值等操做linux
註解 | 解析 | 用法 |
---|---|---|
@Component | 組件註解,使用了該註解會基於註釋的配置和類路徑掃描時,會自動掃描並加載Class到ICO容器中 | 註釋在類上 |
@Controller | 應用在MVC層(控制層)DispatcherServlet會自動掃描註解了此註解的類,而後將web請求映射到註解了@RequestMapping的方法上 | 註釋在類上 |
@Service | 應用在service層(業務邏輯層 | 註釋在類上 |
@Repository | 應用在dao層(數據訪問層) | 註釋在類上 |
@Autowired和@Inject、@Resource,能夠與@Qualifier或者@Name配合使用,防止多實例注入時出錯,以及值注入@Value。git
註解 | 解析 | 用法 |
---|---|---|
@Autowired | 經過AutowiredAnnotationBeanPostProcessor類實現的依賴注入,默認是根據類型進行注入的,所以若是有多個類型同樣的Bean候選者,則須要限定其中一個候選者,不然將拋出異常。 | 可註釋在字段上,在方法上 |
@Inject | 做用與@Autowired同樣 | 可註釋在字段上,在方法上、構造器上 |
@Resource | 默認按照名稱進行裝配,名稱能夠經過name屬性進行指定 | 可註釋在字段上,在方法上 |
@Qualifier | 限定描述符除了能根據名字進行注入,更能進行更細粒度的控制如何選擇候選者,可與@Autowired或者@Inject進行組合使用,進行精確注入 | 可註釋字段上,在方法上、參數上以及註解中 |
@Scope,具備4個做用域可看Scope做用域以及涉及的問題章節,以及生命週期過程處理@PostConstruct、@PreDestroy 。web
註解 | 解析 | 用法 |
---|---|---|
@Scope | 具備4個做用域singleton,prototype,session,request,默認爲singleton單例模式 | 可註釋在Class建立時 |
@PostConstruct | 至關於init-method,使用在方法上,當Bean初始化時執行 | 可註釋在方法上 |
@PreDestroy | 至關於destory-method,使用在方法上,當Bean銷燬時執行 | 可註釋在方法上 |
@Service //組件注入,註明爲service組件
@Scope("prototype")//聲明Scope爲Prototype
public class UseFunctionService {
@Autowired //默認按type注入
@Qualifier("functionService") //精確注入
FunctionService functionService;
@Resource(name="baseDao")//默認按name注入,能夠經過name和type屬性進行選擇性注入
private BaseDao baseDao;
@Inject
@Qualifier("userServiceImpl") //精確注入
public IUserService userService;
@PostConstruct//執行完構造函數後執行
public postConstruct(){
System.out.println("postConstruct");
}
@PreDestroy//在銷燬Bean前執行
public perDestroy(){
System.out.println("perDestroy");
}
@Autowired
public void setUserDao(@Qualifier("userDao") UserDao userDao) {
this.userDao = userDao;
}
public String SayHello(String word){
return functionService.sayHello(word);
}
}
複製代碼
@Configuration可替換xml配置文件進行配置。被註解的類內部包含有一個或多個被@Bean註解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,並用於構建bean定義,初始化Spring容器。可與@PropertySource一塊兒使用。 @Configuration做爲元註解延伸了@SpringBootConfiguration正則表達式
註解 | 解析 | 用法 |
---|---|---|
@Configuration | 配置類註解,能夠與@Beae、@PropertySource一塊兒使用,進行配置 | 註釋在類、接口、枚舉上 |
@SpringBootConfiguration | 組合註解,@Configuration配置、@EnableAutoConfiguration啓用自動配置、@ComponentScan默認掃描@SpringBootApplication所在類的同級目錄以及它的子目錄 | 可註解在類上 |
@AutoConfigureAfter | 在指定的自動配置類以後再配置 | 可註解在類上 |
@ComponentScan註解,被@Configuration註解標註的類上面,涉及了@filter過濾器註解spring
註解 | 解析 | 用法 |
---|---|---|
@ComponentScan | 定義掃描的路徑,默認就會加載標識了@Controller,@Service,@Repository,@Component註解的類到spring容器中,excludeFilters 指定掃描的時候須要排除的組件,includeFilters 指定掃描的時候只包含的組件 | 可註解在類Class |
@ComponentScans | 包含着@ComponentScan數組 | 可註解在類Class |
@filter | 聲明要用做包含過濾器或排除過濾器的類型過濾器 | 可註解在@ComponentScan中 |
能夠將配置文件、配置文件中的屬性、以及系統屬性等注入所需的字段中,或者bean中編程
註解 | 解析 | 用法 |
---|---|---|
@Value | 值注入,能夠注入普通字符,系統屬性,表達式運算結果,其餘Bean的屬性,文件內容,網址請求內容,配置文件屬性值等等 | 可註釋在字段上,方法上、參數上 |
@Bean | 聲明當前方法的返回值爲一個Bean,並且返回的Bean對應的類中能夠定義init()方法和destroy()方法,而後在@Bean(initMethod=」init」,destroyMethod=」destroy」)定義,在構造以後執行init,在銷燬以前執行destroy | 註解在方法上,註解上 |
@PropertySource | 指定配置文件位置,與@configuration類一塊兒使用 | 註解在類Class、接口上 |
@ImportResource | 加載xml配置文件 | 註解在類Class、接口上 |
@ConfigurationProperties | 將properties屬性與一個Bean及其屬性相關聯 | 可註解在類上、接口上 |
@Import | 用來導入配置類的 | 可註解在類上、接口上 |
@Conditional根據知足某一特定條件建立特定的Bean,基於@Conditional元註解可延伸不少條件註解。json
註解 | 解析 | 用法 |
---|---|---|
@ConditionalOnBean | Spring容器中是否存在對應的實例,能夠經過實例的類型、類名、註解、暱稱去容器中查找(能夠配置從當前容器中查找或者父容器中查找或者二者一塊兒查找)這些屬性都是數組,經過」與」的關係進行查找 | 可註解方法上 |
@ConditionalOnClass | 類加載器中是否存在對應的類,邏輯跟@ConditionalOnBean相似 | 可註解在方法上、類Class、接口上 |
@ConditionalOnExpression | 判斷SpEL 表達式是否成立 | 可註解在方法上、類Class、接口上 |
@ConditionalOnJava | 指定Java版本是否符合要求 | 可註解在方法上、類Class、接口上 |
@ConditionalOnMissingBean | Spring容器中是否缺乏對應的實例,邏輯跟@ConditionalOnBean相似 | 可註解在方法上、類Class、接口上 |
@ConditionalOnMissingClass | Spring容器中是否缺乏對應的實例,邏輯跟@ConditionalOnBean相似 | 可註解在方法上、類Class、接口上 |
@ConditionalOnNotWebApplication | 應用程序是不是非Web程序,沒有提供屬性,只是一個標識 | 可註解在方法上、類Class、接口上 |
@ConditionalOnProperty | 應用環境中的屬性是否存在,邏輯跟@ConditionalOnBean相似 | 可註解在方法上、類Class、接口上上 |
@ConditionalOnResource | 是否存在指定的資源文件。只有一個屬性resources,是個String數組。會從類加載器中去查詢對應的資源文件是否存在可註解在方法上、類Class、接口上 | |
@Profile | 指定某個bean屬於哪個profile:spring.profiles.active和spring.profiles.default(默認) | 可註解在方法上,類class、接口上 |
@Configuration
//@SpringBootConfiguration
@ComponentScan(value="com.cn",ComponentDefaultFilters=true,
includeFilters={
@Filter(type=FilterType.ANNOTATION,classes={Controller.class}),
@Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})
})
@ImportResource("classpath:condition.xml")//導入xml配置
@Import(ConditionConfig.class)//導入ConditionConfig Class,並會實例化到容器中以及ConditionConfig中的配置也一塊兒注入
public class Config {
@Value("I Love You!") //注入普通字符
private String normal;
@Value("#{systemProperties['os.name']}") //注入操做系統屬性
private String osName;
@Value("#{ T(java.lang.Math).random() * 100.0 }") //注入表達式運算結果
private double randomNumber;
@Value("#{demoService.another}") //注入其餘Bean的屬性
private String fromAnother;
@Value("classpath:org/light4j/sping4/usually/el/test.txt") //注入文件內容
private Resource testFile;
@Value("http://www.baidu.com") //注入網址內容
private Resource testUrl;
@Value("${book.name}") //注入屬性文件
private String bookName;
@Bean//加載bean
@Conditional(WindowsCondition.class) // 經過@Conditional註解,符合Windows條件則true
@ConditionalOnResource(resources="classpath:windows.ini")//在類路徑下是否存在windows.ini文件,存在爲true,最後進行註解與操做,爲true實例化Bean
public ListService windowsListService(){
return new WindowsListService();
}
@Bean
@ConditionalOnClass(LinuxCondition.class) // 經過@ConditionalOnClass註解,符合Linux條件則true
@ConditionalOnProperty(name = "synchronize", havingValue = "true"))//若是synchronize在配置文件中而且值爲true
public ListService linuxListService(){
return new LinuxListService();
}
//加載配置文件中前綴爲spring.datasource的屬性
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource jwcDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConditionalOnMissingClass({LinuxCondition.class,WindowsCondition.class})//當容器中缺失這兩個Class時爲true
@Profile("dev")//在dev環境下爲true 最後結果爲註解和之與,true實例化該Bean
public ListService macListService(){
return new MacListService();
}
}
複製代碼
驗證註解在javax.validation包下:windows
註解 | 解析 | 用法 |
---|---|---|
@Valid | 啓動校驗,Errors參數要緊跟在帶有@Valid註解的參數後面,@Valid註解所標註的就是要檢驗的參數 | 可註釋在字段、方法、構造器、參數上 |
@AssertFalse | 所註解的元素必須是Boolean類型,而且值爲false | 可註釋在字段、方法、構造器、參數上 |
@AssertTrue | 所註解的元素必須是Boolean類型,而且值爲true | 可註釋在字段、方法、構造器、參數上 |
@DecimalMax | 所註解的元素必須是數字,而且它的值要小於或等於給定的BigDecimalString值 | 可註釋在字段、方法、構造器、參數上 |
@DecimalMin | 所註解的元素必須是數字,而且它的值要大於或等於給定的BigDecimalString值 | 可註釋在字段、方法、構造器、參數上 |
@Digits | 所註解的元素必須是數字,而且它的值必須有指定的位數 | 可註釋在字段、方法、構造器、參數上 |
@Future | 所註解的元素的值必須是一個未來的日期 | 可註釋在字段、方法、構造器、參數上 |
@Max | 所註解的元素必須是數字,而且它的值要小於或等於給定的值 | 可註釋在字段、方法、構造器、參數上 |
@Min | 所註解的元素必須是數字,而且它的值要大於或等於給定的值 | 可註釋在字段、方法、構造器、參數上 |
@NotNull | 所註解元素的值必須不能爲null | 可註釋在字段、方法、構造器、參數上 |
@Null | 所註解元素的值必須爲null | 可註釋在字段、方法、構造器、參數上 |
@Past | 所註解的元素的值必須是一個已過去的日期 | 可註釋在字段、方法、構造器、參數上 |
@Pattern | 所註解的元素的值必須匹配給定的正則表達式 | 可註釋在字段、方法、構造器、參數上 |
@Size | 所註解的元素的值必須是String、集合或數組,而且它的長度要符合給定的範圍 | 可註釋在字段、方法、構造器、參數上 |
AspectJ的註解式在org.aspectj包下數組
註解 | 解析 | 用法 |
---|---|---|
@Aspect | 聲明該類是一個切面 | 可註解在類Class、接口上 |
@After | 通知方法會在目標方法返回或拋出異常後調用 | 可註解在方法上 |
@Before | 通知方法會在目標方法調用以前執行 | 可註解在方法上 |
@Around | 通知方法會將目標方法封裝起來 | 可註解在方法上 |
@AfterReturning | 通知方法會在目標方法返回後調用 | 可註解在方法上 |
@AfterThrowing | 通知方法會在目標方法拋出異常後調用 | 可註解在方法上 |
@Pointcut | 可以在一個@AspectJ切面內定義可重用的切點,(經過@Pointcut註解聲明頻繁使用的切點表達式) | 可註解在方法上 |
@annotation | 限定匹配帶有指定註解的鏈接點 | 可註解在建言(advice)上,如@After等 |
@EnableAspectJAutoProxy | 開啓Spring對AspectJ的支持,在配置類上 | 可註解在類Class、接口上 |
execution指示器是咱們在編寫切點定義時最主要使用的指示器:
註解 | 解析 | 用法 |
---|---|---|
AspectJ指示器 | 描 述 | |
arg() | 限制鏈接點匹配參數爲指定類型的執行方法 | 可註釋在AspectJ的註解式、如@After等 |
@args() | 限制鏈接點匹配參數由指定註解標註的執行方法可註釋在AspectJ的註解式,如@After等 | |
execution() | 用於匹配是鏈接點的執行方法 | 可註釋在AspectJ的註解式,如@After等 |
this() | 限制鏈接點匹配AOP代理的bean引用爲指定類型的類 | 可註釋在AspectJ的註解式,如@After等 |
Target | 限制鏈接點匹配目標對象爲指定類型的類可註釋在AspectJ的註解式,如@After等 | |
@target() | 限制鏈接點匹配特定的執行對象,這些對象對應的類要具備指定類型的註解 | 可註釋在AspectJ的註解式,如@After等 |
within() | 限制鏈接點匹配指定的類型 | 可註釋在AspectJ的註解式,如@After等 |
@within() | 限制鏈接點匹配指定註解所標註的類型(當使用Spring AOP時,方法定義在由指定的註解所標註的類裏) | 可註釋在AspectJ的註解式,如@After等 |
@Aspect //聲明該類是一個切面
@Component
public class LogAspect {
private final String POINT_CUT ="execution(* org.sping4.ccww.aop.DemoMethodService.*(..))";
@Pointcut("@annotation(org.ccww.sping4.base.aop.Action)") //聲明切面
public void annotationPointCut(){};
@After("annotationPointCut()") //聲明一個建言,並使用@Pointcut定義的切點
public void after(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
Action action = method.getAnnotation(Action.class);
System.out.println("註解式攔截 " + action.name()); //⑤
}
@Before("execution(* org.sping4.ccww.aop.DemoMethodService.*(..))")//聲明一個建言,此建言直接使用攔截規則做爲參數
public void before(JoinPoint joinPoint){
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
System.out.println("方法規則式攔截,"+method.getName());
}
/**
* 後置返回
* 若是第一個參數爲JoinPoint,則第二個參數爲返回值的信息
* 若是第一個參數不爲JoinPoint,則第一個參數爲returning中對應的參數
* returning:限定了只有目標方法返回值與通知方法參數類型匹配時才能執行後置返回通知,不然不執行,
* 參數爲Object類型將匹配任何目標返回值
*/
@AfterReturning(value = POINT_CUT,returning = "result")
public void doAfterReturningAdvice1(JoinPoint joinPoint,Object result){
System.out.println("第一個後置返回通知的返回值:"+result);
}
}
複製代碼
註解 | 解析 | 用法 |
---|---|---|
@EnableWebMvc | 會開啓一些默認配置,如一些ViewResolver或者MessageConverter等 | 可註解在類Class、接口上 |
@RequestMapping | 用來映射Web請求(訪問路徑和參數),處理類和方法的(即配置URL和方法之間的映射),註解在方法上的@RequestMapping路徑會繼承註解在類上的路徑 | 可註解在類Class、接口上、方法上 |
@ResponseBody | 支持將返回值放在response體內 | 可註解在返回值前或者方法上 |
@RequestBody | 容許requ | est的參數在request體內 |
@PathVariable | 用來接收路徑參數,如/ccww/003,可接收003做爲參數 | 可註解在參數前 |
@RestController | 組合註解,組合了@Controller和@ResponseBody,這就意味着當你只開發一個和頁面交互數據的控制的時候,須要使用此註解。若沒有此註解,要想實現上述功能,則須要本身在代碼中加@Controller和@ResponseBody兩個註解 | 可註解在類Class、接口上 |
@ModelAttribute | 綁定請求參數到命令對象、暴露@RequestMapping 方法返回值爲模型數據、暴露表單引用對象爲模型數據 | 可註解在方法、參數上 |
用例:
@Controller //聲明此類是一個控制器
@RequestMapping("/ccww") //映射此類的訪問路徑是/ccww
//@RestController // 使用@RestController,聲明是控制器,而且返回數據時不須要@ResponseBody
//@RequestMapping("/ccww")
public class DemoAnnoController {
//此方法未標註路徑,所以使用類級別的路徑/anno;produces可定製返回的response的媒體類型和字符集,或返回值是json對象,則設置porduces="application/json;charset=UTF-8"
@RequestMapping(produces = "text/plain;charset=UTF-8")
public @ResponseBody String index(HttpServletRequest request) { //可接受HttpServletRequest做爲參數,固然也能夠接受HttpServletResponse做爲參數。此處的@ResponseBody用在返回值前
return "url:" + request.getRequestURL() + " can access";
}
@RequestMapping(value = "/demoPathVar/{str}", produces = "text/plain;charset=UTF-8")//
public @ResponseBody String demoPathVar(@PathVariable String str, //接受路徑參數,並在方法參數前結合@PathVariable使用,訪問路徑爲/ccww/demoPathVar/xxx
HttpServletRequest request) {
return "url:" + request.getRequestURL() + " can access,str: " + str;
}
//常規的request參數獲取,訪問路徑爲/ccww/requestParam?id=1
@RequestMapping(value = "/requestParam", produces = "text/plain;charset=UTF-8")
public @ResponseBody String passRequestParam(Long id,
HttpServletRequest request) {
return "url:" + request.getRequestURL() + " can access,id: " + id;
}
@RequestMapping(value = "/obj", produces = "application/json;charset=UTF-8")
@ResponseBody // 可註解在方法上
public String passObj(DemoObj obj, HttpServletRequest request) {
return "url:" + request.getRequestURL()
+ " can access, obj id: " + obj.getId()+" obj name:" + obj.getName();
}
//映射不一樣的路徑到相同的方法,訪問路徑爲/anno/name1或/anno/name2
@RequestMapping(value = { "/name1", "/name2" }, produces = "text/plain;charset=UTF-8")
public @ResponseBody String remove(HttpServletRequest request) {
return "url:" + request.getRequestURL() + " can access";
}
@RequestMapping(value = "/helloWorld")
//以「user」爲名稱添加到模型對象中供視圖頁面展現使用
public String helloWorld(@ModelAttribute User user) {
return "helloWorld";
}
}
複製代碼
Spring security用戶訪問認證和受權,兩個關鍵註解:
註解 | 解析 | 用法 |
---|---|---|
@EnableWebSecurityConfig | 該註解和@Configuration註解一塊兒使用,註解 WebSecurityConfigurer類型的類,或者利用@EnableWebSecurity註解繼承WebSecurityConfigurerAdapter的類,這樣就構成了Spring Security的配置 | 可註解在Class上 |
@EnableGlobaleMethodSecurity | Spring security默認是禁用註解的,要想開啓註解,須要繼承WebSecurityConfigurerAdapter的類上加@EnableGlobalMethodSecurity註解,來判斷用戶對某個控制層的方法是否具備訪問權限 | 可註釋在Class上 |
用@EnableGlobaleMethodSecurity的參數想要開啓註解:
具體開啓註解解析以下:
註解 | 解析 | 用法 |
---|---|---|
@Secured | 認證是否有權限訪問 | 可註解方法上 |
@RolesAllowed | 該方法只要具備其參數中任意一種權限就能夠訪問(能夠省略前綴ROLE_) | 可註解在方法上 |
@DenyAll | 拒絕全部訪問 | 可註解在方法上 |
@PermitAll | 容許全部訪問 | 可註解在方法上 |
@PreAuthoriz | 在方法執行以前執行,並且這裏能夠調用方法的參數,也能夠獲得參數值 | 可註解在方法上 |
@PostAuthorize | 在方法執行以後執行,並且這裏能夠調用方法的返回值,若是EL爲false,那麼該方法也已經執行完了,可能會回滾 | 可註解在方法上 |
@PreFilter | 在方法執行以前執行,並且這裏能夠調用方法的參數,而後對參數值進行過濾或處理,EL變量filterObject表示參數,若是有多個參數,使用filterTarget註解參數 | 可註解在方法上 |
@PostFilter | 在方法執行以後執行,並且這裏能夠經過表達式來過濾方法的結果 | 可註解在方法上 |
用例:
兩個關鍵註解@EnableWebSecurityConfig、@EnableGlobaleMethodSecurity:
@Configuration
@EnableWebSecurity//開啓webSecurityConfig
@EnableGlobalMethodSecurity(prePostEnabled = true.securedEnabled = true)//可開啓多個註解
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
.....
}
複製代碼
其餘註解:
@Secured("IS_AUTHENTICATED_ANONYMOUSLY")//@Secured註解,匿名訪問
public Account readAccount(Long id){
...
}
@Secured("ROLE_TELLER")//@Secured註解具備TELLER訪問
public Account readAccount(Long id){
...
}
@PreAuthorize("#userId==authentication.principal.userId or hasAuthority('ADMIN')")
//利用Spring Security的@P標註參數,或者Spring Data的@Param標註參數來接收@PreAuthorize的返回值
public void changPassword(@P("userId")long userId){
...
}
@PreAuthorize("hasAuthority('ADMIN')")//PreAuthorize是否具備admin角色
public void changePassword(long userId){
...
}
複製代碼
註解 | 解析 | 用法 |
---|---|---|
@SpringBootApplication | Spring Boot核心註解,組合註解(@Configuration、@EnableAutoConfiguration、@ComponentScan),主要是爲了開啓自動配置 | 註解在Class,接口 |
@EnableAutoConfiguration | 讓Spring Boot根據類路徑中的jar包依賴爲當前項目進行自動配置 | 可註釋在Class、interface上 |
歡迎轉載,標明出處!!!