Spring從3.0開始使用注解道媚,到Spring5.0跺讯,已經(jīng)大量使用碟绑,注解的使用可以省卻大量的xml文件
1. HelloWorld的例子改成用注解來實現(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());
}
}
-
運行結(jié)果
image
2.Student和Phone的例子改成注解實現(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);
}
}
-
運行結(jié)果
image
關(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
注解在 屬性 上;為單個屬性提供 set 方法; 注解在 類 上蜡坊,為該類所有的屬性提供 set 方法, 都提供默認(rèn)構(gòu)造方法赎败。
@Getter
注解在 屬性 上秕衙;為單個屬性提供 get 方法; 注解在 類 上,為該類所有的屬性提供 get 方法僵刮,都提供默認(rèn)構(gòu)造方法据忘。
@Log4j
注解在 類 上;為類提供一個 屬性名為 log 的 log4j 日志對象搞糕,提供默認(rèn)構(gòu)造方法勇吊。
@AllArgsConstructor
注解在 類 上;為類提供一個全參的構(gòu)造方法窍仰,加了這個注解后汉规,類中不提供默認(rèn)構(gòu)造方法了。
@NoArgsConstructor
注解在 類 上驹吮;為類提供一個無參的構(gòu)造方法针史。
@EqualsAndHashCode
注解在 類 上, 可以生成 equals、canEqual碟狞、hashCode 方法啄枕。
@NonNull
注解在 屬性 上,會自動產(chǎn)生一個關(guān)于此參數(shù)的非空檢查族沃,如果參數(shù)為空频祝,則拋出一個空指針異常泌参,也會有一個默認(rèn)的無參構(gòu)造方法。
@Cleanup
這個注解用在 變量 前面常空,可以保證此變量代表的資源會被自動關(guān)閉沽一,默認(rèn)是調(diào)用資源的 close() 方法,如果該資源有其它關(guān)閉方法窟绷,可使用 @Cleanup(“methodName”) 來指定要調(diào)用的方法锯玛,也會生成默認(rèn)的構(gòu)造方法
@ToString
這個注解用在 類 上,可以生成所有參數(shù)的 toString 方法兼蜈,還會生成默認(rèn)的構(gòu)造方法攘残。
@RequiredArgsConstructor
這個注解用在 類 上,使用類中所有帶有 @NonNull 注解的或者帶有 final 修飾的成員變量生成對應(yīng)的構(gòu)造方法为狸。
@Value
這個注解用在 類 上歼郭,會生成含所有參數(shù)的構(gòu)造方法,get 方法辐棒,此外還提供了equals病曾、hashCode、toString 方法漾根。
@SneakyThrows
這個注解用在 方法 上泰涂,可以將方法中的代碼用 try-catch 語句包裹起來,捕獲異常并在 catch 中用 Lombok.sneakyThrow(e) 把異常拋出辐怕,可以使用 @SneakyThrows(Exception.class) 的形式指定拋出哪種異常逼蒙,也會生成默認(rèn)的構(gòu)造方法。
@Synchronized
這個注解用在 類方法 或者 實例方法 上寄疏,效果和 synchronized 關(guān)鍵字相同是牢,區(qū)別在于鎖對象不同,對于類方法和實例方法陕截,synchronized 關(guān)鍵字的鎖對象分別是類的 class 對象和 this 對象驳棱,而 @Synchronized 的鎖對象分別是 私有靜態(tài) final 對象 lock 和 私有 final 對象 lock,當(dāng)然农曲,也可以自己指定鎖對象社搅,此外也提供默認(rèn)的構(gòu)造方法。