Spring IOC容器組件注入的幾種方式

整理一下之前Spring的學習筆記,大致有一下幾種Spring注入到容器中的方法:

1)、配置在xml的方式。

2)、開啟包掃描@ComponentScan使用@Component,@Service,@Controller,@Repository(其實后三個都繼承@Component)注冊組件到spring容器里面

3)、使用@Bean注入

4)、使用@Import快速導入組件

@Configuration

? 聲明為配置類,與bean.xml一致

XML方式注入

Sping最開始的用法,先定義好xml文件,使用ClassPathXmlApplicationContext()加載指定xml文件就創建好容器了,當Bean過多的時候,使用xml配置就顯得比較繁瑣,所以在現在的大環境下,這種注入方法已經過時了,就簡單的提一下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="user" class="com.test.SpringCoreTest.test00.bean.User"><property name="name" value="Tom"></property><property name="age" value="12"></property></bean></beans>

@ComponentScan

需和@Configuration注解一起使用,與xml當中的<context:component-scan base-package="" />一致,表示掃描指定包下的類將帶有@Component注解的類全部掃描到容器當中

有幾個常用的參數需了解一下:

basePackages: 掃描指定包下的類并且注入到spring容器里面

useDefaultFilters:是否使用默認過濾器,和excludeFilters、includeFilters配置一起使用

includeFilters:包含過濾器為過濾的內容,當useDefaultFilters為false的時候才生效

excludeFilters:去除指定過濾器過濾的內容,當useDefaultFilters為true的時候才能生效

過濾器為@ComponentScan的內部注解類@Filter:

? ? ? classes:指定類,與type搭配使用

?? ? ? ?type:過濾器的類型org.springframework.context.annotation.FilterType.class枚舉類中(共有五種,僅記錄三種經常使用的類型)

? ? ? ? ? ?? ANNOTATION:指定過濾哪些注解,例如@Controller

? ? ? ? ? ?? ASSIGNABLE_TYPE:指定過濾哪些類

? ? ? ? ? ?? CUSTOM:自定義過濾器,可繼承TypeFilter接口,實現match方法

示例:

public class SpringTest01Filter implements TypeFilter {/*** @param metadataReader 讀取當前掃描類的信息* @param metadataReaderFactory 可以獲取其他任何類的信息*/public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)throws IOException {//獲取當前注解信息ClassMetadata classMetadata = metadataReader.getClassMetadata();//獲取當前掃描類的信息String className = classMetadata.getClassName();System.out.println("====>>>>"+className);if(className.contains("er"))//如果當前掃描類信息包含er的時候,注入到Spring容器return true;elsereturn false;}}//配置類
@ComponentScan(basePackages="com.test.SpringCoreTest.test01.config",includeFilters= {@Filter(type = FilterType.CUSTOM,classes= {SpringTest01Filter.class})
},useDefaultFilters=true)
@Configuration

這里會有個問題,為什么在使用過濾器的時候對useDefaultFilters有要求?源碼中解析:

ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(this.registry,componentScan.getBoolean("useDefaultFilters"), this.environment, this.resourceLoader);
//該段代碼中獲取了useDefaultFilters的值
//進入該類中
public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,Environment environment, @Nullable ResourceLoader resourceLoader) {Assert.notNull(registry, "BeanDefinitionRegistry must not be null");this.registry = registry;if (useDefaultFilters) {registerDefaultFilters();//useDefaultFilters為true時,該方法開啟了注冊默認過濾器的方法}setEnvironment(environment);setResourceLoader(resourceLoader);}//進入到registerDefaultFilters方法里面
protected void registerDefaultFilters() {//執行了當前方法重置了includeFilters包含的過濾器,導致帶有Component注解的類都會加載到容器里面,所以在useDefaultFilters為true的情況下includeFilters失效的原因在此this.includeFilters.add(new AnnotationTypeFilter(Component.class));ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader();try {this.includeFilters.add(new AnnotationTypeFilter(((Class<? extends Annotation>) ClassUtils.forName("javax.annotation.ManagedBean", cl)), false));logger.trace("JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning");}catch (ClassNotFoundException ex) {// JSR-250 1.1 API (as included in Java EE 6) not available - simply skip.}try {this.includeFilters.add(new AnnotationTypeFilter(((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Named", cl)), false));logger.trace("JSR-330 'javax.inject.Named' annotation found and supported for component scanning");}catch (ClassNotFoundException ex) {// JSR-330 API not available - simply skip.}}

@Bean

需和@Configuration一起使用,容器中的key為方法名,bean為返回的對象,默認為單例。示例:

@Configuration
public class SpringConfig01 {@Beanpublic User user() {return new User();}//....
}

以下三個注解可以和@Bean一起使用:

@Scope

? 指定容器組件類型

? prototype:多例模式,當容器創建時,并不會創建對象,而是在調用時創建一個新的對象

? singleton:單例模式,容器創建時,對象也會創建

? request:主要是針對web應用,每提交一次請求,都回去創建一個對象

? session:針對web應用,創建一個session創建一個對象

@Lazy

? 懶加載只有當前組件第一次被調用的時候才會去創建對象,針對單例模式

@Conditional

? 可指定在某些條件下,才能將當前組件注入到容器,

? 參數為繼承org.springframework.context.annotation.Condition.class的實現類

/*** @param context 可以使用ApplicationContext(上下文)* @param metadata 可以獲取到注解信息*/public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {//獲取到BeanFactoryConfigurableListableBeanFactory beanFactory = context.getBeanFactory();//可獲取環境參數,如jvm環境,spring環境等等Environment environment = context.getEnvironment();String osName = environment.getProperty("os.name");if(osName.contains("Windows"))//如果當前環境為window,則創建當前組件并加載到容器中return true;return false;}

@Import

??快速導入組件,共三種形式,這個算是一個比較主要的注入方式吧,在Spring中,需要做一些擴展的時候都會需要用到這個,比如:mybatis-spring融合,開啟AOP功能等使用的就是這里的第三種方式

1)、@Import(value = { Dog.class,Cat.class })//快速導入到容器中,以類的全路徑作為bean的ID

2)、@Import(value = { SpringTest03ImportSelector.class })//實現ImportSelector接口

public class SpringTest03ImportSelector implements ImportSelector {public String[] selectImports(AnnotationMetadata importingClassMetadata) {//返回為類的全類名return new String [] {};//注意一下,這邊必須返回一個空的數組,不然啟動報錯空指針異常}}//在源碼org.springframework.context.annotation.ConfigurationClassParser.class類中
private Collection<SourceClass> asSourceClasses(String... classNames) throws IOException {List<SourceClass> annotatedClasses = new ArrayList<>(classNames.length);//這里的classNames為之前ImportSelector返回的數組,為null的話即報錯for (String className : classNames) {annotatedClasses.add(asSourceClass(className));}return annotatedClasses;}

3)、@Import(value = { SpringTest03ImportBeanDefinitionRegistrar.class })//實現ImportBeanDefinitionRegistrar接口,所有的bean注冊都會使用到該接口進行注冊

/*** @param importingClassMetadata 當前類的注解信息 * @param registry BeanDefinition的注冊類* 可做條件修改*/
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {boolean b1 = registry.containsBeanDefinition("user");if(b1) {registry.registerBeanDefinition("pig", new RootBeanDefinition(Pig.class));}

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537154.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537154.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我們是如何拿下Google和Facebook Offer的?

http://posts.careerengine.us/p/57c3a1c1a09633ee7e57803c 大家好&#xff0c;我是小高&#xff0c;CMU CS Master&#xff0c;來Offer第一期學員&#xff0c;2014年初在孫老師的帶領下我在幾個月的時間內進入了Yahoo&#xff0c;并工作了近2年。2016年初&#xff0c;Yahoo工作…

Spring中BeanFactory和FactoryBean的區別

先介紹一下Spring的IOC容器到底是個什么東西&#xff0c;都說是一個控制反轉的容器&#xff0c;將對象的控制權交給IOC容器&#xff0c;其實在看了源代碼之后&#xff0c;就會發現IOC容器只是一個存儲單例的一個ConcurrentHashMap<String, BeanDefinition> BeanDefiniti…

python中數字和字符串可以直接相加_用c語言或者python將文件中特定字符串后面的數字相加...

匿名用戶1級2014-08-31 回答代碼應該不難吧。既然用爬蟲爬下來了&#xff0c;為什么爬取數據的時候沒做處理呢。之前用過Scrapy爬蟲框架&#xff0c;挺好用的&#xff0c;你可研究下。代碼&#xff1a;#!codingutf-8import osimport reimport random# 獲取當前目錄文件列表def …

Spring中Aware的用法以及實現

Aware 在Spring當中有一些內置的對象是未開放給我們使用的&#xff0c;例如Spring的上下文ApplicationContext、環境屬性Environment&#xff0c;BeanFactory等等其他的一些內置對象&#xff0c;而在我們可以通過實現對應的Aware接口去拿到我們想要的一些屬性&#xff0c;一般…

c#字符型轉化為asc_C#字符串和ASCII碼的轉換

//字符轉ASCII碼&#xff1a;public static int Asc(string character){if (character.Length 1){System.Text.ASCIIEncoding asciiEncoding new System.Text.ASCIIEncoding();int intAsciiCode (int)asciiEncoding.GetBytes(character)[0];return (intAsciiCode);}else{thr…

topcoder srm 625 div1

problem1 link 假設第$i$種出現的次數為$n_{i}$&#xff0c;總個數為$m$&#xff0c;那么排列數為$T\frac{m!}{\prod_{i1}^{26}(n_{i}!)}$ 然后計算回文的個數&#xff0c;只需要考慮前一半&#xff0c;得到個數為$R$&#xff0c;那么答案為$\frac{R}{T}$. 為了防止數字太大導致…

Spring的組件賦值以及環境屬性@PropertySource

PropertySource 將指定類路徑下的.properties一些配置加載到Spring當中&#xff0c; 有個跟這個差不多的注解PropertySources Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented public interface PropertySources {PropertySource[] value();} 使用…

python語音識別框架_橫評:五款免費開源的語音識別工具

編者按&#xff1a;本文原作者 Cindi Thompson&#xff0c;美國德克薩斯大學奧斯汀分校(University of Texas at Austin)計算機科學博士&#xff0c;數據科學咨詢公司硅谷數據科學(Silicon Valley Data Science&#xff0c;SVDS)首席科學家&#xff0c;在機器學習、自然語言處理…

csharp read excel file get sheetName list

1 /// <summary>2 /// 3 /// 塗聚文4 /// 201208035 /// Geovin Du6 ///找到EXCEL的工作表名稱 要考慮打開的文件的進程問題7 /// </summary>8 /// <param name"filename">…

Spring Bean的生命周期以及IOC源碼解析

IOC源碼這一塊太多只能講個大概吧&#xff0c;建議還是去買本Spring IOC源碼解析的書來看比較好&#xff0c;我也是自己看源代碼以及視頻整理的筆記 Bean的生命周期大概可以分為四個階段&#xff0c;具體的等會再說&#xff0c;先看看IOC的源碼吧 1、bean的創建 2、bean的屬…

python3繪圖_python3繪圖示例2(基于matplotlib:柱狀圖、分布圖、三角圖等)

#!/usr/bin/env python# -*- coding:utf-8 -*-from matplotlib import pyplot as pltimport numpy as npimport pylabimport os,sys,time,math,random# 圖1-給已有的圖加上刻度filer‘D:\jmeter\jmeter3.2\data\Oracle數據庫基礎.png‘arrnp.array(file.getdata()).reshape(fil…

bzoj4152-[AMPPZ2014]The_Captain

Description 給定平面上的n個點&#xff0c;定義(x1,y1)到(x2,y2)的費用為min(|x1-x2|,|y1-y2|)&#xff0c;求從1號點走到n號點的最小費用。 Input 第一行包含一個正整數n(2<n<200000)&#xff0c;表示點數。 接下來n行&#xff0c;每行包含兩個整數x[i],yi&#xff0c;…

python日志統計_python試用-日志統計

最近兩天嘗試用python代替bash寫Linux Shell腳本來統計日志。發現python寫起來比bash更簡單和容易閱讀&#xff0c;發現不少驚喜。所以寫了一個粗糙的腳本來統計日志。目標1、通過簡單命令和腳本統計事件發生數2、日志限定文本類型假定環境日志文件&#xff1a;1.logtest:aaa,1…

Spring AOP兩種使用方式以及如何使用解析

AOP是一種面向切面編程思想&#xff0c;也是面向對象設計&#xff08;OOP&#xff09;的一種延伸。 在Spring實現AOP有兩種實現方式&#xff0c;一種是采用JDK動態代理實現&#xff0c;另外一種就是采用CGLIB代理實現&#xff0c;Spring是如何實現的在上篇已經講到了Spring Be…

如何用python生成可執行程序必須經過_python怎么生成可執行文件

.py文件&#xff1a;對于開源項目或62616964757a686964616fe58685e5aeb931333363393664者源碼沒那么重要的&#xff0c;直接提供源碼&#xff0c;需要使用者自行安裝Python并且安裝依賴的各種庫。(Python官方的各種安裝包就是這樣做的).pyc文件&#xff1a;有些公司或個人因為機…

Jmeter 老司機帶你一小時學會Jmeter

Jmeter的安裝 官網下載地址&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 作為Java應用&#xff0c;是需要JDK環境的&#xff0c;因此需要下載安裝JAVA&#xff0c;并且作必要的的環境變量配置。 一、bin目錄 examples:    目錄中有CSV樣例 jmeter.bat/jmeter…

MongoDB位運算基本使用以及位運算應用場景

最近在公司業務上用到了二進制匹配數據&#xff0c;但是MongoDB進行二進制運算&#xff08;Bitwise&#xff09;沒用過&#xff0c;網上博客文章少&#xff0c;所以就上官網看API&#xff0c;因此記錄一下&#xff0c;順便在普及一下使用二進制位運算的一些應用。 在MongoDB的…

好用的下拉第三方——nicespinner

1.簡介 GitHub地址&#xff1a;https://github.com/arcadefire/nice-spinner Gradle中添加&#xff1a; allprojects {repositories {...maven { url "https://jitpack.io" }} }dependencies {implementation com.github.arcadefire:nice-spinner:1.3.7 }2.使用 xml文…

Mybatis配置文件參數定義

官網有時候進不去&#xff0c;所以就記錄一下Mybatis的配置文件的各項參數定義&#xff0c;大家也可以上官網查詢&#xff0c;官方文檔&#xff0c;進不進的去看各自的緣分了 properties 定義配置&#xff0c;在這里配置的屬性可以在整個配置文件使用&#xff1b;可以加載指定…