欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot @Configuration和@Componment的區(qū)別及說明

 更新時間:2024年06月04日 08:59:11   作者:@Ycoder  
這篇文章主要介紹了springboot @Configuration和@Componment的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

@Configuration和@Componment的區(qū)別

@Configuration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}
public class Car {

    private int id;

    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

public class Driver {

    private int id;

    private String name;

    private Car car;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyTestConfig {

    @Bean
    public Driver driver() {
        Driver driver = new Driver();
        driver.setId(1);
        driver.setName("driver");
        driver.setCar(car());
        return driver;
    }

    @Bean
    public Car car() {
        Car car = new Car();
        car.setId(1);
        car.setName("car");
        return car;
    }

}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Component
public class MyTestConfig {
    @Bean
    public Driver driver() {
        Driver driver = new Driver();
        driver.setId(1);
        driver.setName("driver");
        driver.setCar(car());
        return driver;
    }
    @Bean
    public Car car() {
        Car car = new Car();
        car.setId(1);
        car.setName("car");
        return car;
    }

}

上面兩段代碼除MyTestConfig類上的注解不同之外其他都相同,但Spring對兩者的處理方式是完全不一樣的。

第一段代碼會像我們期望的一樣正常運行

因為driver()這段代碼中driver.setCar(car())方法會由Spring代理執(zhí)行,

Spring發(fā)現(xiàn)方法所請求的Bean已經(jīng)在容器中,那么就直接返回容器中的Bean。

所以全局只有一個Car對象的實例。

第二段代碼在執(zhí)行driver()

時driver.setCar(car())不會被Spring代理,會直接調(diào)用car()方法獲取一個全新的Car對象實例,所以全局會有多個Car對象的實例

造成這種差異的原因如下:

概括就是 @Configuration 中所有帶 @Bean

注解的方法都會被動態(tài)代理,因此調(diào)用該方法返回的都是同一個實例。

其工作原理是:如果方式是首次被調(diào)用那么原始的方法體會被執(zhí)行并且結(jié)果對象會被注冊到Spring上下文中,之后所有的對該方法的調(diào)用僅僅只是從Spring上下文中取回該對象返回給調(diào)用者。

在上面的第二段代碼中

driver.setCar(car())只是純JAVA方式的調(diào)用,多次調(diào)用該方法返回的是不同的對象實例。

要修正第二段代碼中的問題,可以使用@Autowired如下所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

//@Configuration
@Component
public class MyTestConfig2 {

    @Autowired
    Car car;
    
    @Bean
    public Driver driver() {
        Driver driver = new Driver();
        driver.setId(1);
        driver.setName("driver");
        driver.setCar(car);
        return driver;
    }

    @Bean
    public Car car() {
        Car car = new Car();
        car.setId(1);
        car.setName("car");
        return car;
    }

}

總結(jié)

1. 通過@Configuration或者@Componment注解的類默認是非懶加載,可以使用@Lazy或者在@Bean上@Lazy開啟懶加載;

2. 通過@Configuration注解的類默認會被CGLIB動態(tài)代理,所有被 @Bean 注解標記的方法將來都是通過代理方法進行調(diào)用,在該類中使用@Bean時為單列;

3. 通過@Componment注解的類默認不會產(chǎn)生動態(tài)代理,在該類中使用@Bean,是多實例的。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java sdk安裝及配置案例詳解

    Java sdk安裝及配置案例詳解

    這篇文章主要介紹了Java sdk安裝及配置案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Spring 4.0新功能:@Conditional注解詳細介紹

    Spring 4.0新功能:@Conditional注解詳細介紹

    Spring Boot的強大之處在于使用了Spring 4框架的新特性:@Conditional注釋,此注釋使得只有在特定條件滿足時才啟用一些配置。下面這篇文章主要給大家介紹了關于Spring4.0中新功能:@Conditional注解的相關資料,需要的朋友可以參考下。
    2017-09-09
  • java 數(shù)據(jù)結(jié)構(gòu)中棧和隊列的實例詳解

    java 數(shù)據(jù)結(jié)構(gòu)中棧和隊列的實例詳解

    這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)中棧和隊列的實例詳解的相關資料,主要使用數(shù)組與線性表的方法來實現(xiàn),需要的朋友可以參考下
    2017-09-09
  • Java?阻塞隊列BlockingQueue詳解

    Java?阻塞隊列BlockingQueue詳解

    本文詳細介紹了BlockingQueue家庭中的所有成員,包括他們各自的功能以及常見使用場景,通過實例代碼介紹了Java?阻塞隊列BlockingQueue的相關知識,需要的朋友可以參考下
    2022-06-06
  • Mybatis如何使用動態(tài)語句實現(xiàn)批量刪除(delete結(jié)合foreach)

    Mybatis如何使用動態(tài)語句實現(xiàn)批量刪除(delete結(jié)合foreach)

    這篇文章主要介紹了Mybatis如何使用動態(tài)語句實現(xiàn)批量刪除(delete結(jié)合foreach),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Springboot+Mybatis實現(xiàn)分頁加條件查詢功能

    Springboot+Mybatis實現(xiàn)分頁加條件查詢功能

    這篇文章主要為大家詳細介紹了Springboot+Mybatis實現(xiàn)分頁加條件查詢,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • java Collection 之List學習介紹

    java Collection 之List學習介紹

    本篇文章小編為大家介紹,java Collection 之List學習介紹。需要的朋友參考下
    2013-04-04
  • java實現(xiàn)簡單的ATM項目

    java實現(xiàn)簡單的ATM項目

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單的ATM項目,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 使用abstract格式修飾抽象方法

    使用abstract格式修飾抽象方法

    abstract是抽象的意思,用于修飾方法方法和類,修飾的方法是抽象方法,修飾的類是抽象類,這篇文章主要介紹了怎樣使用abstract格式修飾抽象方法,需要的朋友可以參考下
    2023-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)中雙向鏈表的實現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)中雙向鏈表的實現(xiàn)

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中雙向鏈表的實現(xiàn),雙向鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu),它允許在鏈表中的任意位置進行高效的插入和刪除操作,需要的朋友可以參考下
    2022-05-05

最新評論