注解本身沒有功能的,就和 xml 一樣。注解和 xml 都是一種元數(shù)據(jù),元數(shù)據(jù)即解釋數(shù)據(jù)的數(shù)據(jù),這就是所謂配置。
Spring 部分
聲明 bean 的注解
@Component 組件,沒有明確的角色,在類上使用注解
@Component,該注解的 value 屬性用于指定該 bean 的 id 值
@Repository 用于對 DAO 實現(xiàn)類進行注解
@Service 用于對 Service 實現(xiàn)類進行注解
@Controller 用于對 Controller 實現(xiàn)類進行注解
注入 bean 的注解
@Autowired:由 Spring 提供
@Inject:由 JSR-330 提供
@Resource:由 JSR-250 提供
都可以注解在 set 方法和屬性上,推薦注解在屬性上(一目了然,少寫代碼)。
Java 配置類相關注解
@Configuration 表示當前類充當 Spring 容器,即所有的 Bean 將由這個類來創(chuàng)建(類上)
@Bean 注解在方法上,聲明當前方法的返回值為一個 bean ,替代 xml 中的方式(方法上)
@Configuration 聲明當前類為配置類,其中內部組合了 @Component 注解,表明這個類是一個 bean (類上)
@ComponentScan 用于對 Component 進行掃描,相當于 xml 中的(類上)
@WishlyConfiguration 為 @Configuration 與 @ComponentScan 的組合注解,可以替代這兩個注解
切面(AOP)相關注解
Spring 支持 AspectJ 的注解式切面編程。
- @Aspect 指定當前 POJO 類將作為切面(類上)
使用 @After 、 @Before 、 @Around 定義建言 (advice) ,可直接將攔截規(guī)則(切點)作為參數(shù)。
@After 在方法執(zhí)行之后執(zhí)行(方法上)
@Before 在方法執(zhí)行之前執(zhí)行(方法上)
@Around 在方法執(zhí)行之前與之后執(zhí)行(方法上)
@Pointcut 定義切入點
在 Java 配置類中使用 @EnableAspectJAutoProxy 注解開啟 Spring 對 AspectJ 代理的支持(類上)
@Bean 的屬性支持
- @Scope 設置 Spring 容器如何新建 Bean 實例(方法上,得有 @Bean )
其設置類型包括:
Singleton (單例,一個 Spring 容器中只有一個 bean 實例,默認模式)
Protetype (每次調用新建一個 bean )
Request ( web 項目中,給每個 http request 新建一個 bean )
Session ( web項 目中,給每個 http session 新建一個 bean )
GlobalSession (給每一個 global http session 新建一個 Bean 實例)
@StepScope 在 Spring Batch 中還有涉及
@PostConstruct 由 JSR-250 提供,在構造函數(shù)執(zhí)行完之后執(zhí)行,等價于 xml 配置文件中 bean 的 initMethod
@PreDestory 由 JSR-250 提供,在 Bean 銷毀之前執(zhí)行,等價于 xml 配置文件中 bean 的 destroyMethod
@Value注解
@Value 為屬性注入值(屬性上)支持如下方式的注入:
1. 注入普通字符串
@Value("normal")
private String normal
2. 注入文件資源
@Value("classpath:com/huang/spring/configinject/config.txt")
private Resource resourceFile;
3. 注入 URL 資源
@Value("https://www.huangyuanzhi.top")
private Resource testUrl;
4. 注入表達式結果
@Value("#{ T(java.lang.Math).random() * 100.0 }")
private double randomNumber;
5. 注入其它 bean 屬性
@Value("{domeClass.name}")
String name;
6. 注入配置文件
@Value("${book.name}")
private String bookName;
注入配置使用方法:
(1) 編寫配置文件(test.properties)
book.name=《三體》
(2) @PropertySource 加載配置文件(類上)
@PropertySource("classpath:com/huang/spring/configinject/config.properties")
(3) 還需配置一個 PropertySourcesPlaceholderConfigurer 的 bean 。
環(huán)境切換
@Profile 通過設定 Environment 的 ActiveProfiles 來設定當前 context 需要使用的配置環(huán)境。(類或方法上)
@Conditional Spring4 中可以使用此注解定義條件話的 bean ,通過實現(xiàn) Condition 接口,并重寫 matches 方法,從而決定該 bean 是否被實例化。(方法上)
異步相關
@EnableAsync 配置類中,通過此注解開啟對異步任務的支持,敘事性 AsyncConfigurer 接口(類上)
@Async 在實際執(zhí)行的 bean 方法使用該注解來申明其是一個異步任務(方法上或類上所有的方法都將異步,需要 @EnableAsync 開啟異步任務)
定時任務相關
@EnableScheduling 在配置類上使用,開啟計劃任務的支持(類上)
@Scheduled 來申明這是一個任務,包括 cron , fixDelay , fixRate 等類型(方法上,需先開啟計劃任務的支持)
@Enable* 注解說明
這些注解主要用來開啟對xxx的支持。
@EnableAspectJAutoProxy 開啟對 AspectJ 自動代理的支持
@EnableAsync 開啟異步方法的支持
@EnableScheduling 開啟計劃任務的支持
@EnableWebMvc 開啟 Web MVC 的配置支持
@EnableConfigurationProperties 開啟對 @ConfigurationProperties 注解配置 Bean 的支持
@EnableJpaRepositories 開啟對 SpringData JPA Repository 的支持
@EnableTransactionManagement 開啟注解式事務的支持
@EnableCaching 開啟注解式的緩存支持
測試相關注解
@RunWith 運行器,Spring 中通常用于對 JUnit 的支持
@ContextConfiguration 用來加載配置 ApplicationContext ,其中 classes 屬性用來加載配置類
Spring MVC 部分
@EnableWebMvc 在配置類中開啟 Web MVC 的配置支持,如一些 ViewResolver 或者 MessageConverter 等,若無此句,重寫 WebMvcConfigurerAdapter 方法(用于對 SpringMVC 的配置)。
@Controller 表示當前類為處理器
@RequestMapping 表示當前方法為處理器方法;該方法要對 value 屬性所指定的 URL 進行處理與響應; 被注解的方法的方法名可以隨意。
@ResponseBody 支持將返回值放在 response 內,而不是一個頁面,通常用戶返回 json 數(shù)據(jù)(返回值旁或方法上)
@RequestBody 允許 request 的參數(shù)在 request 體中,而不是在直接連接在地址后面。(放在參數(shù)前)
@PathVariable 用于接收路徑參數(shù),比如@ RequestMapping(“/hello/{name}”) 申明的路徑,將注解放在參數(shù)中前,即可獲取該值,通常作為 Restful 的接口實現(xiàn)方法。
@RestController 該注解為一個組合注解,相當于 @Controller 和 @ResponseBody 的組合,注解在類上,意味著,該 Controller 的所有方法都默認加上了 @ResponseBody。
@ControllerAdvice 通過該注解,我們可以將對于控制器的全局配置放置在同一個位置,注解了 @Controller 的類的方法可使用
@ExceptionHandler 、 @InitBinder 、 @ModelAttribute 注解到方法上,這對所有注解了 @RequestMapping 的控制器內的方法有效。
@ExceptionHandler 用于全局處理控制器里的異常
@InitBinder 用來設置 WebDataBinder , WebDataBinder 用來自動綁定前臺請求參數(shù)到 Model 中。
@ModelAttribute 本來的作用是綁定鍵值對到 Model 里,在 @ControllerAdvice 中是讓全局的 @RequestMapping 都能獲得在此處設置的鍵值對。