最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解@component與@Configuration注解

 更新時間:2023年11月02日 10:21:44   作者:四月是你的  
這篇文章主要介紹了深入理解@component與@Configuration注解,從Spring3.0,@Configuration用于定義配置類,可替換xml配置文件,被注解的類內(nèi)部包含有一個或多個被@Bean注解的方法,這些方法將會被掃描,并用于構(gòu)建bean定義,初始化Spring容器,需要的朋友可以參考下

1、@Configuration

從Spring3.0,@Configuration用于定義配置類,可替換xml配置文件,被注解的類內(nèi)部包含有一個或多個被@Bean注解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,并用于構(gòu)建bean定義,初始化Spring容器。

注意:@Configuration注解的配置類有如下要求:

1、@Configuration不可以是final類型;

2、@Configuration不可以是匿名類;

3、嵌套的configuration必須是靜態(tài)類。

用@Configuration加載spring的用法

@Configuration配置spring并啟動spring容器

@Configuration標(biāo)注在類上,相當(dāng)于把該類作為spring的xml配置文件中的,作用為:配置spring容器(應(yīng)用上下文)

@Configuration啟動容器+@Bean注冊Bean

@Bean下管理bean的生命周期

可以使用基于 Java 的配置來管理 bean 的生命周期。@Bean 支持兩種屬性,即 initMethod和destroyMethod,這些屬性可用于定義生命周期方法。在實例化 bean或即將銷毀它時,容器便可調(diào)用生命周期方法。生命周期方法也稱為回調(diào)方法,因為它將由容器調(diào)用。使用 @Bean 注釋注冊的 bean 也支持JSR-250 規(guī)定的標(biāo)準(zhǔn) @PostConstruct 和 @PreDestroy 注釋。如果您正在使用 XML 方法來定義bean,那么就應(yīng)該使用 bean 元素來定義生命周期回調(diào)方法。

@Bean標(biāo)注在方法上(返回某個實例的方法),等價于spring的xml配置文件中的作用:注冊bean對象

@Bean注解在返回實例的方法上,如果未通過@Bean指定bean的名稱,則默認與標(biāo)注的方法名相同; @Bean注解默認作用域為單例singleton作用域,可通過@Scope(“prototype”)設(shè)置為原型作用域; 既然@Bean的作用是注冊bean對象,那么完全可以使用@Component、@Controller、@Service、@Ripository等注解注冊bean,當(dāng)然需要配置@ComponentScan注解進行自動掃描。

  • @Configuration啟動容器+@Component注冊Bean
  • 使用 AnnotationConfigApplicationContext 注冊 AppContext 類的兩種方法
  • 配置Web應(yīng)用程序(web.xml中配置AnnotationConfigApplicationContext)

2、@component注解

1、@controller 控制器(注入服務(wù))

2、@service 服務(wù)(注入dao)

3、@repository dao(實現(xiàn)dao訪問)

4、@component (把普通pojo實例化到spring容器中,相當(dāng)于配置文件中的<bean id="" class=""/>)

如果 Web 應(yīng)用程序采用了經(jīng)典的三層分層結(jié)構(gòu)的話,最好在持久層、業(yè)務(wù)層和控制層分別采用 @Repository、@Service 和 @Controller 對分層中的類進行注釋,而用 @Component 對那些比較中立的類進行注釋。 在 一個稍大的項目中,通常會有上百個組件,如果這些組件采用xml的bean定義來配置,顯然會增加配置文件的體積,查找以及維護起來也不太方便。 Spring2.5為我們引入了組件自動掃描機制,他可以在類路徑底下尋找標(biāo)注了 @Component,@Service,@Controller,@Repository注解的類,并把這些類納入進spring容器中管理。它的作用 和在xml文件中使用bean節(jié)點配置組件時一樣的。

說明: <context:component-scan base-package=”com.*”> 上面的這個例子是引入Component組件的例子,其中base-package表示為需要掃描的所有子包。

共同點:被@controller 、@service、@repository 、@component 注解的類,都會把這些類納入進spring容器中進行管理

3、@configuration和@component之間的區(qū)別

@configuration和@component之間的區(qū)別是:@Component注解的范圍最廣,所有類都可以注解,但是@Configuration注解一般注解在這樣的類上:這個類里面有@Value注解的成員變量和@Bean注解的方法,就是一個配置類。

展示兩個注解的配圖

在這里插入圖片描述

可以看出@Configuration注解中有@Component注解 從定義來看,@Configuration 注解本質(zhì)上還是@Component,因此context:component-scan/ 或者 @ComponentScan都能處理@Configuration注解的類。

@Configuration標(biāo)記的類必須符合下面的要求:

  1. 配置類必須以類的形式提供(不能是工廠方法返回的實例),允許通過生成子類在運行時增強(cglib 動態(tài)代理)。
  2. 配置類不能是 final類(沒法動態(tài)代理)。
  3. 配置注解通常為了通過 @Bean 注解生成 Spring 容器管理的類,配置類必須是非本地的(即不能在方法中聲明,不能是private)。
  4. 任何嵌套配置類都必須聲明為static。
  5. @Bean方法可能不會反過來創(chuàng)建進一步的配置類(也就是返回的 bean 如果帶有@Configuration,也不會被特殊處理,只會作為普通的bean)

加載過程

Spring 容器在啟動時,會加載默認的一些PostProcessor,其中就有ConfigurationClassPostProcessor,這個后置處理程序?qū)iT處理帶有@Configuration注解的類,這個程序會在bean 定義加載完成后,在bean初始化前進行處理。主要處理的過程就是使用cglib動態(tài)代理增強類,而且是對其中帶有@Bean注解的方法進行處理。

基于Java的配置我們通常使用@Configuration注解來聲明Spring Bean 除此之外我們還能使用@Component聲明Spring Bean

具體實例驗證兩者的區(qū)別,下面代碼使用@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;
    }
}

測試代碼如下

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestApplicationTests {

    @Autowired
    private Car car;

    @Autowired
    private Driver driver;

    @Test
    public void contextLoads() {
        boolean result = driver.getCar() == car;
        System.out.println(result ? "同一個car" : "不同的car");
    }

}

打印結(jié)果如下: 同一個car

使用@component注解除Config類上的注解不同之外其他都相同,Spring對兩者的處理方式就會完全不一樣。

  • @configuration:會像我們期望的一樣正常運行,因為new SimpleBeanConsumer(simpleBean())這段代碼中simpleBean()方法會由Spring代理執(zhí)行,Spring發(fā)現(xiàn)方法所請求的Bean已經(jīng)在容器中,那么就直接返回容器中的Bean。所以全局只有一個SimpleBean對象的實例。
  • @component:在執(zhí)行new SimpleBeanConsumer(simpleBean()) 時simpleBean()不會被Spring代理,會直接調(diào)用simpleBean()方法獲取一個全新的SimpleBean對象實例所以全局會有多個SimpleBean對象的實

使用Configuration時在driver和spring容器之中的是同一個對象,而使用Component時是不同的對象。 造成不同結(jié)果的原因在ConfigurationClassPostProcessor類之中,通過調(diào)用enhanceConfigurationClasses方法,為被注解@Configuration的類進行CGLIB代理 雖然Component注解也會當(dāng)做配置類,但是并不會為其生成CGLIB代理Class,所以在生成Driver對象時和生成Car對象時調(diào)用car()方法執(zhí)行了兩次new操作,所以是不同的對象。當(dāng)時Configuration注解時,生成當(dāng)前對象的子類Class,并對方法攔截,第二次調(diào)用car()方法時直接從BeanFactory之中獲取對象,所以得到的是同一個對象。

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

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

到此這篇關(guān)于深入理解@component與@Configuration注解的文章就介紹到這了,更多相關(guān)@component與@Configuration注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Bean?Searcher配合SpringBoot的使用詳解

    Bean?Searcher配合SpringBoot的使用詳解

    這篇文章主要介紹了Bean?Searcher配合SpringBoot的使用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Java實現(xiàn)二分查找的變種

    Java實現(xiàn)二分查找的變種

    這篇文章主要為大家詳細介紹了Java實現(xiàn)二分查找的變種,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 解決java.util.NoSuchElementException異常的問題

    解決java.util.NoSuchElementException異常的問題

    這篇文章主要介紹了解決java.util.NoSuchElementException異常的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • JavaWeb監(jiān)聽器Listener實例解析

    JavaWeb監(jiān)聽器Listener實例解析

    這篇文章主要為大家詳細介紹了JavaWeb監(jiān)聽器Listener實例,針對監(jiān)聽器進行進行細致分析,感興趣的小伙伴們可以參考一下
    2016-08-08
  • spring 集成 mybatis的實例詳解

    spring 集成 mybatis的實例詳解

    這篇文章主要介紹了spring 集成 mybatis的實例詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 用IntelliJ IDEA看Java類圖的方法(圖文)

    用IntelliJ IDEA看Java類圖的方法(圖文)

    這篇文章主要介紹了用IntelliJ IDEA看Java類圖的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Java數(shù)據(jù)結(jié)構(gòu)之List的使用總結(jié)

    Java數(shù)據(jù)結(jié)構(gòu)之List的使用總結(jié)

    List是Java中比較常用的集合類,指一系列存儲數(shù)據(jù)的接口和類,可以解決復(fù)雜的數(shù)據(jù)存儲問題,本文就來拿實際案例總結(jié)介紹一下List的使用方法,感興趣的朋友快來看看吧
    2021-11-11
  • IDEA連接mysql報錯的問題及解決方法

    IDEA連接mysql報錯的問題及解決方法

    這篇文章主要介紹了IDEA連接mysql報錯的問題及解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java實現(xiàn)導(dǎo)入導(dǎo)出Excel文件的方法(poi,jxl)

    Java實現(xiàn)導(dǎo)入導(dǎo)出Excel文件的方法(poi,jxl)

    這篇文章主要介紹了Java實現(xiàn)導(dǎo)入導(dǎo)出Excel文件的方法(poi,jxl),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • java編譯時與運行時概念與實例詳解

    java編譯時與運行時概念與實例詳解

    本篇文章通過實例對 java程序編譯時與運行時進行了詳解,需要的朋友可以參考下
    2017-04-04

最新評論

祥云县| 东平县| 丰县| 延庆县| 洛扎县| 武胜县| 南阳市| 安国市| 安阳市| 会宁县| 射洪县| 综艺| 荣成市| 保靖县| 靖远县| 手机| 临汾市| 保定市| 陇西县| 鄯善县| 铜川市| 娱乐| 清远市| 阳春市| 卢氏县| 岢岚县| 万源市| 桐柏县| 宽甸| 壤塘县| 乐安县| 留坝县| 许昌县| 广平县| 临沭县| 新和县| 桐城市| 麻城市| 四会市| 黄陵县| 阿克陶县|