Spring中的Bean的掃瞄 例項化 初始化

2021-10-24 13:58:41 字數 3057 閱讀 8359

在spring啟動之後,個人暫時將spring注入bean物件的過程分為3個大的步驟,分別是:

bean的掃瞄→bean的例項化→bean的初始化。

第一步:bean的掃瞄

//配置類掃瞄

//配置檔案xml掃瞄

//直接包路徑掃瞄

import org.springframework.context.annotation.componentscan;

/** * @description:

* @author:19047590

* @date: created in 2020-05-23 16:56

*/@componentscan("com.asop")}

啟動類:

public class main 

}

this();

//這個方式就用來完成spring中的初始化需要的一些基本的bd

register(componentclasses);

//bean的注入

refresh();

} /**

* through calls and then manually .

*///reader 對於外部的beandefinition進行讀取的

//父類的構造方法 建立乙個讀取註解的bean定義讀取器

this.reader = new annotatedbeandefinitionreader(this);

//可以用來掃瞄包或者類 然後轉化成bd

//實際上掃瞄包工作的時候不是scanner這個物件完成的

//是spring自己new乙個classpathbeandefinitionscanner

//這裡的scanner僅僅是為了能夠在外部呼叫annotationconfig

this.scanner = new classpathbeandefinitionscanner(this); }

//建立了beanfactory

this.beanfactory = new defaultlistablebeanfactory(); }

註冊到beanfactory的核心的**

//annotatedgenericbeandefinition abd 繼承了genericbeandefinition 用來處理註解類,註冊為beandefinition

annotatedgenericbeandefinition abd = new annotatedgenericbeandefinition(beanclass);

abd.setinstancesupplier(supplier);

abd.setscope(scopemetadata.getscopename());

beandefinitionholder definitionholder = new beandefinitionholder(abd, beanname);

//將自定義註解類註冊進去。

beandefinitionreaderutils.registerbeandefinition(definitionholder, this.registry);

public void refresh() throws bean***ception, illegalstateexception
string packagesearchpath = resourcepatternresolver.classpath_all_url_prefix +

resolvebasepackage(basepackage) + '/' + this.resourcepattern;

//將該路徑下的類轉化為spring自定義的resource類。

接下來會for迴圈來判斷該類是否是需要註冊的物件

for (resource resource : resources) 

candidates.add(sbd);

} protected boolean iscandidatecomponent(metadatareader metadatareader) throws ioexception

} for (typefilter tf : this.includefilters)

} return false;

}

如果符合條件,會新增到linkedhashset集合candidates中。

然後將掃瞄出來的類轉化為beandefinitionholder型別的set集合並返回

for (beandefinition candidate : candidates) 

if (candidate instanceof annotatedbeandefinition)

if (checkcandidate(beanname, candidate))

}} return beandefinitions;

往下執行後會執行擴充套件的beanfactorypostprocessor

private static void invokebeanfactorypostprocessors(

collection extends beanfactorypostprocessor> postprocessors, configurablelistablebeanfactory beanfactory)

}

以上步驟就是spring啟動之後掃瞄bean的主要的流

Spring 中的Bean 自動掃瞄

將spring 配置成如下這樣.就表示 spring 將掃瞄所有的com.yourhz下面的bean.那麼bean應當如何寫才能被他掃瞄到呢。我們看如下乙個例子。在類名上面加如下一句,則表示這是乙個受制於spring 的 bean controller 如果寫成這樣的,估計表示bean的控制代碼名稱...

spring 註解掃瞄bean配置

spring公共配置 spring 會自動掃瞄com.zghw下的spring註解 常用註解 定義bean的註解 controller controller bean的名稱 定義控制層bean,如action service service bean的名稱 定義業務層bean repository ...

Spring自動掃瞄和管理Bean

spring2.5 為我們引入了元件自動掃瞄機制,它可以在類路徑下尋找標記了 component service controller repository註解的類,並把這些類納入到spring容器中管理,它的作用和在xml中使用bean節點配置元件一樣。要使用自動掃瞄機制,我們需要把配置檔案如下配...