spring5學習系列之------1 給容器註冊組件一 @Configuration  @Bean  @Scope  @Lazy

               在工作中我們對spring已經很常用了,但是用的大部分都是spring一些很少的部分,該系列是基於spring5版本的,先介紹相關組件的內容,在涉及到源碼內容。話不多說,直接上乾貨吧

        常用註解之給容器註冊組件

       一般來說,最原始的spring使用方式是用到xml寫一些配置文件,然後spring讀取配置文件進行掃描並且註冊到容器之中,但是現在基本上都是給予註解的開發,並且以springboot快速開發爲主,springboot底層也是使用的spring,因此本系列基本上是基於註解方式的講解。

首先idea 創建一個spring的項目,pom.xml引入相關配置

 spring之所以被用到的這麼多,最重要的主要功能就是IOC和AOP,關於ioc和aop的相關概念這裏就不多做解釋了,首先我們測試一下ioc容器的相關功能,如何給容器中註冊我們需要的組件呢?一般來說有四種方式

   1  @Bean[導入的第三方包裏面的組件]

  我們首先創建一個POJO person ,然後寫一個配置類並且標註註解@Configuration,和在方法寫一個@Bean的註解

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String name;
    private Integer age;
    private String value;
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Config {
    @Bean
    public Person person(){
        return new Person("哈哈哈",18,"秀啊");
    }
}

之後新建一個配置類 ,第一行寫上spring讀取改配置類config,第二行是打印該容器中有多少bean,輸入結果發現person已經註冊到了容器之中。

@Test
    public void demo2(){
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
        String[] names = applicationContext.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }

 這裏以上我們用到了2個註解 @Configuration  @Bean,其實這裏config類上的@Configuration要不要我們都可以把person注入進去,只要AnnotationConfigApplicationContext去掃描了config這個類,那麼我們寫@Configuration註解的主要意思是表明該類是一個配置類,約定規範一些。既然我們已經把person注入到容器之中了,那我們該設想spring中的bean是單例還是多例?是在什麼時候加載的呢?如何指定spring的bean的名稱呢?

首先我們解決是單例還是多利的,測試方法測試一下就知道了重新改寫測試方法,debug輸出一下

 在默認情況下來說,容器中的bean是單例的,因爲最後比較相等返回true,並且單例的bean是在容器直接初始化的時候就加載完畢,在我們debug第一行執行完畢的時候,可以看到容器中已經有個person這個bean,後續我們去調用getBean的時候不會在初始化。

  如何更改bean的名稱呢?點開bean註解,會看到裏面會有一個name value,通才情況下Bean的名稱默認取的方法名,如需更改,只需要在@Bean("xxx") 即可,如果需要把原本的單例變成多實例,可以用到@Scope註解,通過看源碼可得

  @Scope 默認爲單例,可以指定爲4中作用範圍,但是基本上我們通常會用單例 singleton   和多實例 prototype,當如果用了該註解並且指定範圍爲多實例,那麼spring容器不會再初始化的時候就創建好,而是再每次調用的時候創建一個實例

那麼我們總結一下 :

      singleton (默認值):表示bean是單例的,ioc容器啓動會調用方法創建對象放到ioc容器中。以後每次獲取就是直接從容器                                             中(map.get())中拿。

     prototype:多實例的,ioc容器啓動並不會去調用方法創建對象放在容器中。每次獲取的時候纔會調用方法創建對象,加載方                          式也是懶加載。

那麼如何讓單實例的bean有多實例的加載方式的特性呢,可以用一個註解修飾 @Lazy ,如下所示:

     至此,我們已經學習並且掌握了 spring常用註解的 4個, @Configuration  @Bean  @Scope  @Lazy,除了@Scope是spring2.5就有了,其餘都是3.0時候引入的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章