注解方式開發(fā)bean

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>

  1. 使用@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)造方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容