目錄
1. 註解是什麼?
其實 Java 的註解還是特別常見的,像平時用到的 @Override、@Deprecated 等都是註解的一種表現方式。
對於註解官方解釋:爲我們在代碼中添加信息提供了一種形式化的方法,使我們可以在稍後的某個時刻非常方便地使用這些數據。
2. 註解作用
可以書寫更加乾淨易讀的代碼,簡化重複的工作,比如 Spring 的註解;
另外還提供編譯期類型檢查,比如外匯返傭@Override 當方法簽名對不上覆蓋的方法時,編譯器就會發出錯誤提示。
3. 註解分類
- 註解名字
- 註解類型
- 註解作用
還有JDK本身提供的標準註解:
- @Override
表示當前的方法覆蓋自父類方法。如果不小心拼寫錯誤或者方法簽名對不上,編譯器就會報錯 - @Deprecated
表示此方法已經失效,將在未來版本中刪除 - @SuppressWarnings
關閉編譯器的警告信息 - @Target
元註解,表示該註解用於什麼地方。CONSTRUCTOR:構造器聲明 FIELD:域聲明(包括enum實例) LOCAL_VARIABLE:局部變量聲明 METHOD:方法聲明 PACKAGE:包聲明 PARAMETER:參數聲明 TYPE:類、接口(包括註解類)或者enum聲明
4.Spring註解
spring中使用註解時配置文件的寫法:
<?xml version="1.0" encoding="UTF-8"?>
<span style="font-size:18px;"><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<!--上面的內容是固定的-->
<!--下面這兩行就是開啓掃描註解,第一行是開啓掃描註解,第二行是要掃描的包位置。但是最新的Spring版本中,第一行命令合併到第二行命令中 了,也就是說可以直接寫第二行-->
<context:annotation-config/>
<context:component-scan base-package="com.test" />
</beans>
配置項就配置了對指定的包進行掃描,以實現依賴注入。
4.1、聲明bean的註解
@Component 組件,沒有明確的角色
@Service 在業務邏輯層使用(service層)
@Repository 在數據訪問層使用(dao層)
@Controller 在展現層使用,控制器的聲明(C)
這裏需要注意,雖然暫時Service,Repository,Conreller只是單純的表示bean的所在層,並沒有其他的作用,但是Spring官方文檔中說過,以後這些註解會有自己特有的功能,所以以後儘量避免使用Component通用註解。
4.2、注入bean的註解
@Autowired:由Spring提供,注入bean
@Inject:由JSR-330提供
@Resource:由JSR-250提供
都可以註解在set方法和屬性上,推薦註解在屬性上
4.3、java配置類相關注解
@Configuration 聲明當前類爲配置類,相當於xml形式的Spring配置(類上),配置spring的方式有三種,這個就是第三種javaconfig。
@Bean 註解在方法上,聲明當前方法的返回值爲一個bean,替代xml中的方式(方法上)
@Configuration 聲明當前類爲配置類,其中內部組合了@Component註解,表明這個類是一個bean(類上)
@ComponentScan("") 用於對Component進行掃描,括號裏面寫路徑,相當於xml中的<context:component-scan base-package="com.test" />(類上)
@WishlyConfiguration 爲@Configuration與@ComponentScan的組合註解,可以替代這兩個註解
4.4、切面(AOP)相關注解
Spring支持AspectJ的註解式切面編程。
@Aspect 聲明一個切面(類上)使用@After、@Before、@Around定義建言(advice),可直接將攔截規則(切點)作爲參數。
@After 在方法執行之後執行(方法上)
@Before 在方法執行之前執行(方法上)
@Around 在方法執行之前與之後執行(方法上)
@PointCut 聲明切點
在java配置類中使用@EnableAspectJAutoProxy註解開啓Spring對AspectJ代理的支持(類上)
@Bean的屬性支持
@Scope 設置Spring容器如何新建Bean實例(方法上,得有@Bean)
4.5、其設置類型包括
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提供,在構造函數執行完之後執行,等價於xml配置文件中bean的initMethod
@PreDestory 由JSR-250提供,在Bean銷燬之前執行,等價於xml配置文件中bean的destroyMethod
4.6、@Value註解
@Value 爲屬性注入值(屬性上)
支持如下方式的注入:
//注入普通字符串
@Value("Michael Jackson")
String name;
//注入操作系統屬性
@Value("#{systemProperties['os.name']}")
String osName;
//注入表達式結果
@Value("#{ T(java.lang.Math).random() * 100 }")
String rNum;
//注入其他bean屬性
@Value("#{domClass.name}")
String name;
//注入文件資源
@Value("classpath:com/hgs/hello/test.txt")
Resource file
//注入網站資源
@Value("http://www.baidu.com")
Resource url;
//注入配置文件
@Value("${bo.name}")
String boName
注入配置使用方法:
① 編寫配置文件(test.properties)
book.name=活着
@PropertySource 加載配置文件(類上)
@PropertySource("classpath/com/xxx/test.properties")
還需配置一個PropertySourcesPlaceholderConfigurer的bean。
4.7、環境切換
@Profile 通過設定Environment的ActiveProfiles來設定當前context需要使用的配置環境。(類或方法上)
@Conditional Spring4中可以使用此註解定義條件話的bean,通過實現Condition接口,並重寫matches方法,從而決定該bean是否被實例化。(方法上)
4.8、異步相關
@EnableAsync 配置類中,通過此註解開啓對異步任務的支持,敘事性AsyncConfigurer接口(類上)
@Async 在實際執行的bean方法使用該註解來申明其是一個異步任務(方法上或類上所有的方法都將異步,需要@EnableAsync開啓異步任務)
4.9、定時任務相關
@EnableScheduling 在配置類上使用,開啓計劃任務的支持(類上)
@Scheduled 來申明這是一個任務,包括cron,fixDelay,fixRate等類型(方法上,需先開啓計劃任務的支持)
4.10、@Enable*註解說明
這些註解主要用來開啓對xxx的支持。
@EnableAspectJAutoProxy 開啓對AspectJ自動代理的支持
@EnableAsync 開啓異步方法的支持
@EnableScheduling 開啓計劃任務的支持
@EnableWebMvc 開啓Web MVC的配置支持
@EnableConfigurationProperties 開啓對@ConfigurationProperties註解配置Bean的支持
@EnableJpaRepositories 開啓對SpringData JPA Repository的支持
@EnableTransactionManagement 開啓註解式事務的支持
@EnableTransactionManagement 開啓註解式事務的支持
@EnableCaching 開啓註解式的緩存支持
4.11、測試相關注解
@RunWith 運行器,Spring中通常用於對JUnit的支持
@RunWith(SpringJunit4ClassRunner.class)
@ContextConfiguration 用來加載配置ApplicationContext,其中classes屬性用來加載配置類
@ContextConfiguration(classes={TestCofig.class})
5、SpringMVC的註解
@EnableWebMvc 在配置類中開啓Web MVC的配置支持,如一些ViewResolver或者MessageConverter等,若無此句,重寫WebMvcConfigurerAdapter方法(用於對SpringMVC的配置)。
@Controller 聲明該類爲SpringMVC中的Controller
@RequestMapping 用於映射Web請求,包括訪問路徑和參數(類或方法上)
@ResponseBody 支持將返回值放在response內,而不是一個頁面,通常用戶返回json數據(返回值旁或方法上)
@RequestBody 允許request的參數在request體中,而不是在直接連接在地址後面。(放在參數前)
@PathVariable 用於接收路徑參數,比如@RequestMapping(“/hello/{name}”)申明的路徑,將註解放在參數中前,即可獲取該值,通常作爲Restful的接口實現方法。
@RestController 該註解爲一個組合註解,相當於@Controller和@ResponseBody的組合,註解在類上,意味着,該Controller的所有方法都默認加上了@ResponseBody。
@ControllerAdvice 通過該註解,我們可以將對於控制器的全局配置放置在同一個位置,註解了@Controller的類的方法可使用@ExceptionHandler、@InitBinder、@ModelAttribute註解到方法上,這對所有註解了 @RequestMapping的控制器內的方法有效。
@ExceptionHandler 用於全局處理控制器裏的異常
@InitBinder 用來設置WebDataBinder,WebDataBinder用來自動綁定前臺請求參數到Model中。
@ModelAttribute 本來的作用是綁定鍵值對到Model裏,在@ControllerAdvice中是讓全局的@RequestMapping都能獲得在此處設置的鍵值對。
@Required 適用於bean屬性setter方法,並表示受影響的bean屬性必須在XML配置文件在配置時進行填充。否則,容器會拋出一個BeanInitializationException異常。
@SessionAttributes 默認情況下Spring MVC將模型中的數據存儲到request域中。當一個請求結束後,數據就失效了。如果要跨頁面使用。那麼需要使用到session。而@SessionAttributes註解就可以使得模型中的數據存儲一份到session域中
參數:
- names:這是一個字符串數組。裏面應寫需要存儲到session中數據的名稱。
- types:根據指定參數的類型,將模型中對應類型的參數存儲到session中
- value:和names是一樣的。
樣例代碼:
@Controller
@SessionAttributes(value={"names"},types={Integer.class})
public class ScopeService {
@RequestMapping("/testSession")
public String test(Map<String,Object> map){
map.put("names", Arrays.asList("a","b","c"));
map.put("age", 12);
return "hello";
}
}
常用的註解詳細解釋:
@Controller
SpringMVC 中,控制器Controller 負責處理由DispatcherServlet 分發的請求,它把用戶請求的數據經過業務處理層處理之後封裝成一個Model ,然後再把該Model 返回給對應的View 進行展示。在SpringMVC 中提供了一個非常簡便的定義Controller 的方法,你無需繼承特定的類或實現特定的接口,只需使用@Controller 標記一個類是Controller ,然後使用@RequestMapping 和@RequestParam 等一些註解用以定義URL 請求和Controller 方法之間的映射,這樣的Controller 就能被外界訪問到。
@Service
服務層組件,用於標註業務層組件,表示定義一個bean(實體類),自動根據bean的類名實例化一個首寫字母爲小寫的bean,例如Chinese實例化爲chinese,如果需要自己改名字則:@Service("你自己改的bean名")。
@Repository
它用於將數據訪問層 (DAO 層 ) 的類標識爲 Spring Bean。具體只需將該註解標註在 DAO類上即可。
爲什麼 @Repository 只能標註在 DAO 類上呢?這是因爲該註解的作用不只是將類識別爲Bean,同時它還能將所標註的類中拋出的數據訪問異常封裝爲 Spring 的數據訪問異常類型。 Spring本身提供了一個豐富的並且是與具體的數據訪問技術無關的數據訪問異常結構,用於封裝不同的持久層框架拋出的異常,使得異常獨立於底層的框架。
@RequestMapping
RequestMapping是一個用來處理請求地址映射的註解,可用於類或方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作爲父路徑。
@Autowired
@Autowired 註釋,它可以對類成員變量、方法及構造函數進行標註,完成自動裝配的工作。
@ResponseBody
@ResponseBody註解的作用是將controller的方法返回的對象通過適當的轉換器轉換爲指定的格式之後(@ResponseBody的作用其實是將java對象轉爲json格式的數據。),寫入到response對象的body區,通常用來返回JSON數據或者是XML數據,需要注意的呢,在使用此註解之後不會再走試圖處理器,而是直接將數據寫入到輸入流中,他的效果等同於通過response對象輸出指定格式的數據。
@MapperScan
作用:指定要變成實現類的接口所在的包,然後包下面的所有接口在編譯之後都會生成相應的實現類
添加位置:是在Springboot啓動類上面添加。
@SpringBootApplication
啓動類註解(一般在root下):
該註解被@Configuration、@EnableAutoConfiguration、@ComponentScan 這三個註解所修飾
1、@SpringBootConfiguration繼承自@Configuration,二者功能也一致,標註當前類是配置類,並會將當前類內聲明的一個或多個以@Bean註解標記的方法的實例納入到spring容器中,並且實例名就是方法名。
2、@EnableAutoConfiguration:是spring boot的核心功能,自動配置。這個註釋告訴SpringBoot“猜”你將如何想配置Spring,基於你已經添加jar依賴項。如果spring-boot-starter-web已經添加Tomcat和Spring MVC,這個註釋自動將假設您正在開發一個web應用程序並添加相應的spring設置.
通常推薦將 @EnableAutoConfiguration 配置在 root 包下,這樣所有的子包、類都可以被查找到。
3、@ComponentScan
通俗的講,@ComponentScan 註解會自動掃描指定包下的全部標有 @Component註解 的類,並註冊成bean,當然包括 @Component 下的子註解@Service、@Repository、@Controller。@ComponentScan 註解沒有類似的屬性。
@requestParam
@requestParam主要用於在SpringMVC後臺控制層獲取參數,類似一種是request.getParameter("name"),它有三個常用參數:defaultValue = "0", required = false, value = "isApp";defaultValue 表示設置默認值,required 通過boolean設置是否是必須要傳入的參數,value 值表示接受的傳入的參數類型。
@Scope
用來配置 spring bean 的作用域,它標識 bean 的作用域。
默認值是單例
- singleton:單例模式,全局有且僅有一個實例
- prototype:原型模式,每次獲取Bean的時候會有一個新的實例
- request:request表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效
- session:session作用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效
- global session:只在portal應用中有用,給每一個 global http session 新建一個Bean實例。
@RestController
Spring4之後加入的註解,原來在@Controller中返回json需要@ResponseBody來配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默認返回json格式。
樣例代碼:
@RestController
public class TestController {
@RequestMapping("/test")
public String test(Map<String,Object> map){
return "hello";
}
}
1、@Autowired @Qualifier 與 @Resource
用法:標註在成員變量上,或者set方法上。@Autowired 與 @Resource 都是用於bean自動裝配的。(確切的說@Resource是jdk自帶的註解);
區別:@Autowired裝配默認是通過類型去查找,也可以通過@Qualifier指定名稱查找。而@Resource 默認按照名稱進行查找,當然也可指定類型、指定名稱或者同時指定。指定類型的時候如果找不到或者找到多個都會拋出異常。同時指定類型和名稱的時候,會去找唯一匹配的bean,如果找到多個拋出異常。
例:
/*
*接口
*/
public interface PersonService{
public void eat();
public void play();
}
/*
*接口實現類
*/
@Service("personService")
public class PersonServiceImpl implements PersonService{
@Override
public void eat(){
System.out.println("eat");
}
@Override
public void play(){
System.out.println("play");
}
}
/*
*調用類
*/
public class Demo{
@Resource
private PersonService personService;
@Autowired
private PersonService personService2;
@Autowired
@Qualifier("personService")
private PersonService personService3;
public void test(){
personService.eat();
personService2.eat();
}
}
2、@Service @Component @Controller @Repository
用法:都是標註在類名上,用於註冊一個bean到Spring上下文中。
區別:@Service 用於服務層;@Controller用於控制層;@Repository用於DAO層;不確定的用@Component
例:見示例代碼一(同Service的用法)
3、@RequestMapping @RequestParam
用法:@RequestMapping標註在控制層類上面映射一個請求路徑;@RequestParam 映射一個請求參數;
例:
/*
*控制層類
*/
@Controller
@RequestMapping("/register")
public class RegisterUser{
public void register(@RequestParam("ownerId") int ownerId){
//dosomething
}
}