在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節點配置元件一樣。要使用自動掃瞄機制,我們需要把配置檔案如下配...