1. 程式人生 > >spring容器裡存取bean

spring容器裡存取bean

spring容器裡存取bean

spring容器存取bean的過程是什麼?
Map中是怎麼存放值的?

首先 , 先把各個物件碼出來,把過程搭建好

1 . 建配置類 , 為這個類配置了一個包掃描 , 程式碼如下:
@ComponentScan(
value=“com.db”,excludeFilters=
// 過濾掉@Controller.class, @ControllerAdvice.class描述的類
{@Filter(type=FilterType.ANNOTATION,classes={Controller.class, ControllerAdvice.class})})
public class AppRootConfig {

}

2 . 在這個 com.db 包下新建一個類
@Lazy
@Component
public class LruCache {

}

3 . 測試
//用AppRootConfig 配置類初始化spring容器
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(AppRootConfig.class);
@Test
public void testLruCache(){
LruCache lruCache=
ctx.getBean(“lruCache”,LruCache.class);
System.out.println(lruCache); //

[email protected]
}

從 1 中可以看到, 我們用註解的方式配置了一個"包掃描", @ComponentScan 就類似於我們xml檔案中的
<context:component-scan base-package=“com.db”>
<context:include-filter type=“annotation” expression=""/>
<context:exclude-filter type=“annotation” expression=“Controller.class, ControllerAdvice.class”/>
</context:component-scan>

初始化spring容器的時候,會讀取AppRootConfig.class這個配置類 , 執行包掃描 , 把符合條件的類 , 比如:LruCache ,存到spring容器的Map集合中 , 當我們呼叫的時候 , 它就會從spring容器底層建立一個bean給我們

從 2 可以看出,我們是用了懶載入的 , 當配置類掃描到類的時候 , 會把這個類的描述資訊, 以包名加類名的方式存到一個Map中,
Map<String,BeanDefinition> , 其中 Spring 是Key , 預設是類名首字母小寫 , BeanDefinition , 存的是類的定義(描述資訊) , 我們通常叫BeanDefinition介面為 : bean的定義物件
這是底層的原始碼:在這裡插入圖片描述

在這裡插入圖片描述
這就是第一個Map , 如果沒有用懶載入 , spring容器底層會自動基於第一個Map中的資料建立bean給第二個Map封裝起來,當外部呼叫這個bean時, 第二個Map會根據給出的鍵來找對應的bean , 把bean給出, 但是這種方式在資料量多的時候極其消耗記憶體

所以一般採用懶載入的方式 @Lazy, 這種方式的好處是 , spring容器底層不會自動建立bean, 而是當外部呼叫這個bean時建立, 走一遍過程, 這樣不會浪費記憶體 .
下面是第二個Map的原始碼:
在這裡插入圖片描述
singleton 是bean的作用域, bean 預設是單例
從原始碼可以看出, 第二個Map裡面是儲存的bean的例項