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é)果
image
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注解,簡(jiǎn)化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注解給簡(jiǎn)單類型賦值
@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é)果
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
注解在 屬性 上;為單個(gè)屬性提供 set 方法; 注解在 類 上,為該類所有的屬性提供 set 方法, 都提供默認(rèn)構(gòu)造方法。
@Getter
注解在 屬性 上;為單個(gè)屬性提供 get 方法; 注解在 類 上,為該類所有的屬性提供 get 方法,都提供默認(rèn)構(gòu)造方法。
@Log4j
注解在 類 上;為類提供一個(gè) 屬性名為 log 的 log4j 日志對(duì)象,提供默認(rèn)構(gòu)造方法。
@AllArgsConstructor
注解在 類 上;為類提供一個(gè)全參的構(gòu)造方法,加了這個(gè)注解后,類中不提供默認(rèn)構(gòu)造方法了。
@NoArgsConstructor
注解在 類 上;為類提供一個(gè)無參的構(gòu)造方法。
@EqualsAndHashCode
注解在 類 上, 可以生成 equals、canEqual、hashCode 方法。
@NonNull
注解在 屬性 上,會(huì)自動(dòng)產(chǎn)生一個(gè)關(guān)于此參數(shù)的非空檢查,如果參數(shù)為空,則拋出一個(gè)空指針異常,也會(huì)有一個(gè)默認(rèn)的無參構(gòu)造方法。
@Cleanup
這個(gè)注解用在 變量 前面,可以保證此變量代表的資源會(huì)被自動(dòng)關(guān)閉,默認(rèn)是調(diào)用資源的 close() 方法,如果該資源有其它關(guān)閉方法,可使用 @Cleanup(“methodName”) 來指定要調(diào)用的方法,也會(huì)生成默認(rèn)的構(gòu)造方法
@ToString
這個(gè)注解用在 類 上,可以生成所有參數(shù)的 toString 方法,還會(huì)生成默認(rèn)的構(gòu)造方法。
@RequiredArgsConstructor
這個(gè)注解用在 類 上,使用類中所有帶有 @NonNull 注解的或者帶有 final 修飾的成員變量生成對(duì)應(yīng)的構(gòu)造方法。
@Value
這個(gè)注解用在 類 上,會(huì)生成含所有參數(shù)的構(gòu)造方法,get 方法,此外還提供了equals、hashCode、toString 方法。
@SneakyThrows
這個(gè)注解用在 方法 上,可以將方法中的代碼用 try-catch 語句包裹起來,捕獲異常并在 catch 中用 Lombok.sneakyThrow(e) 把異常拋出,可以使用 @SneakyThrows(Exception.class) 的形式指定拋出哪種異常,也會(huì)生成默認(rèn)的構(gòu)造方法。
@Synchronized
這個(gè)注解用在 類方法 或者 實(shí)例方法 上,效果和 synchronized 關(guān)鍵字相同,區(qū)別在于鎖對(duì)象不同,對(duì)于類方法和實(shí)例方法,synchronized 關(guān)鍵字的鎖對(duì)象分別是類的 class 對(duì)象和 this 對(duì)象,而 @Synchronized 的鎖對(duì)象分別是 私有靜態(tài) final 對(duì)象 lock 和 私有 final 對(duì)象 lock,當(dāng)然,也可以自己指定鎖對(duì)象,此外也提供默認(rèn)的構(gòu)造方法。

