Spring從3.0開始使用注解褂痰,到Spring5.0传货,已經(jīng)大量使用嫌蚤,注解的使用可以省卻大量的xml文件
1. HelloWorld的例子改成用注解來實(shí)現(xiàn)
- HelloWorld類晴裹,采用@Component注解
package com.spring.annotation;
import org.springframework.stereotype.Component;
@Component
public class HelloWorld {
public String getHello() {
return "Hello World";
}
}
- HelloWorldApp類,采用@ComponentScan注解
package com.spring.annotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan
public class HelloApp {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(HelloApp.class);
HelloWorld helloWorld = context.getBean(HelloWorld.class);
System.out.println(helloWorld.getHello());
}
}
-
運(yùn)行結(jié)果
2.Student和Phone的例子改成注解實(shí)現(xiàn)
- Lombok插件的使用
1)Settings->plugins拍冠,搜索Lombok,安裝簇抵,重啟IDEA
2)添加依賴
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
- 使用@Data注解庆杜,簡化POJO類,不用再寫那些構(gòu)造方法碟摆、getter/setter,toString()了晃财,專注定義屬性即可。
- Phone類
package com.spring.annotation;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Data
@Component
public class Phone {
//通過@Value注解給簡單類型賦值
@Value("iPhoneX")
private String brand;
@Value("6666.66")
private double price;
}
- Student類
package com.spring.annotation;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Data
@Component
public class Student {
@Value("Tom")
private String name;
@Value("21")
private int age;
// 引用類型典蜕,通過@Autowired注入Phone的bean
@Autowired
private Phone phone;
}
- StuentApp類
package com.spring.annotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan
public class StudentApp {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(StudentApp.class);
Student student = context.getBean(Student.class);
System.out.println(student);
}
}
-
運(yùn)行結(jié)果
關(guān)于Lombok的進(jìn)一步學(xué)習(xí)
有哪些注解断盛?
@Data
@Setter
@Getter
@Log4j
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@NonNull
@Cleanup
@ToString
@RequiredArgsConstructor
@Value
@SneakyThrows
@Synchronized
注解詳解
@Data
注解在 類 上;提供類所有屬性的 get 和 set 方法嘉裤,此外還提供了equals郑临、canEqual、hashCode屑宠、toString 方法厢洞。
@Setter
注解在 屬性 上;為單個(gè)屬性提供 set 方法; 注解在 類 上典奉,為該類所有的屬性提供 set 方法躺翻, 都提供默認(rèn)構(gòu)造方法。
@Getter
注解在 屬性 上卫玖;為單個(gè)屬性提供 get 方法; 注解在 類 上公你,為該類所有的屬性提供 get 方法,都提供默認(rèn)構(gòu)造方法假瞬。
@Log4j
注解在 類 上陕靠;為類提供一個(gè) 屬性名為 log 的 log4j 日志對象,提供默認(rèn)構(gòu)造方法脱茉。
@AllArgsConstructor
注解在 類 上剪芥;為類提供一個(gè)全參的構(gòu)造方法,加了這個(gè)注解后琴许,類中不提供默認(rèn)構(gòu)造方法了税肪。
@NoArgsConstructor
注解在 類 上;為類提供一個(gè)無參的構(gòu)造方法。
@EqualsAndHashCode
注解在 類 上, 可以生成 equals益兄、canEqual锻梳、hashCode 方法。
@NonNull
注解在 屬性 上净捅,會自動(dòng)產(chǎn)生一個(gè)關(guān)于此參數(shù)的非空檢查疑枯,如果參數(shù)為空,則拋出一個(gè)空指針異常灸叼,也會有一個(gè)默認(rèn)的無參構(gòu)造方法神汹。
@Cleanup
這個(gè)注解用在 變量 前面,可以保證此變量代表的資源會被自動(dòng)關(guān)閉古今,默認(rèn)是調(diào)用資源的 close() 方法屁魏,如果該資源有其它關(guān)閉方法,可使用 @Cleanup(“methodName”) 來指定要調(diào)用的方法捉腥,也會生成默認(rèn)的構(gòu)造方法
@ToString
這個(gè)注解用在 類 上氓拼,可以生成所有參數(shù)的 toString 方法,還會生成默認(rèn)的構(gòu)造方法抵碟。
@RequiredArgsConstructor
這個(gè)注解用在 類 上桃漾,使用類中所有帶有 @NonNull 注解的或者帶有 final 修飾的成員變量生成對應(yīng)的構(gòu)造方法。
@Value
這個(gè)注解用在 類 上拟逮,會生成含所有參數(shù)的構(gòu)造方法撬统,get 方法,此外還提供了equals敦迄、hashCode恋追、toString 方法。
@SneakyThrows
這個(gè)注解用在 方法 上罚屋,可以將方法中的代碼用 try-catch 語句包裹起來苦囱,捕獲異常并在 catch 中用 Lombok.sneakyThrow(e) 把異常拋出,可以使用 @SneakyThrows(Exception.class) 的形式指定拋出哪種異常脾猛,也會生成默認(rèn)的構(gòu)造方法撕彤。
@Synchronized
這個(gè)注解用在 類方法 或者 實(shí)例方法 上,效果和 synchronized 關(guān)鍵字相同猛拴,區(qū)別在于鎖對象不同羹铅,對于類方法和實(shí)例方法,synchronized 關(guān)鍵字的鎖對象分別是類的 class 對象和 this 對象愉昆,而 @Synchronized 的鎖對象分別是 私有靜態(tài) final 對象 lock 和 私有 final 對象 lock职员,當(dāng)然,也可以自己指定鎖對象撼唾,此外也提供默認(rèn)的構(gòu)造方法廉邑。
總結(jié)
以上注解可根據(jù)需要一起搭配使用!