中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring之@ComponentScan自動掃描組件怎么使用

發布時間:2022-06-14 14:58:31 來源:億速云 閱讀:176 作者:iii 欄目:開發技術

這篇文章主要講解了“Spring之@ComponentScan自動掃描組件怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Spring之@ComponentScan自動掃描組件怎么使用”吧!

無注解方式component-scan使用

之前,我們需要掃描工程下一些類上所標注的注解,這些常用注解有:

@Controller,@Service,@Component,@Repository

通過在Spring的配置文件中配置<context:component-scan>掃描對應包下掃描這些注解的方式:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context  
         http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    <!--@Controller,@Service,@Component,@Repository-->
	<context:component-scan base-package="com.jektong.spring"/>
</beans>

注解方式@ComponentScan使用

建三個類,依次將

@Controller,@Repository,@Service,標注這些類:

Spring之@ComponentScan自動掃描組件怎么使用

圖1

現在通過使用注解@ComponentScan的方式來掃描所在包下面的這些類:之前定義的PersonConfig修改:

package com.jektong.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.jektong.spring.Person;
@Configuration
@ComponentScan("com.jektong")
public class PersonConfig {
	@Bean("person01")
	public Person person() {
		return new Person("李四",21);
	}
}

測試,看是否掃描到這些注解所標注的類:PersonTest.java

@Test
public  void test02() {
	ApplicationContext ac = new AnnotationConfigApplicationContext(PersonConfig.class);
	Person bean = ac.getBean(Person.class);
	System.out.println(bean);
	String[] beanDefinitionNames = ac.getBeanDefinitionNames();
	for (String string : beanDefinitionNames) {
		System.out.println(string);
	}
}

測試效果:除了Spring要自動加載的配置類以外也顯示了剛才添加的配置類:

Spring之@ComponentScan自動掃描組件怎么使用

圖2

為何會出現PersonConfig,因為@Configuration本 身就是@Component注解的:

Spring之@ComponentScan自動掃描組件怎么使用

圖3

@ComponentScan的掃描規則

如果需要指定配置類的掃描規則,@ComponentScan提供對應的掃描方式@Filter進行配置類的過濾:

// 掃描包的時候只規定掃描一些注解配置類。
Filter[] includeFilters() default {};
// 掃描包的時候可以排除一些注解配置類。 
Filter[] excludeFilters() default {};

Filter其實也是一個注解,相當于@ComponentScan的子注解,可以看圖4:

Spring之@ComponentScan自動掃描組件怎么使用

圖4

Filter對應的過濾規則如下:

第一種:掃描包的時候只規定掃描一些注解配置類【includeFilters】。

使用這個includeFilters過濾規則,必須解除默認的過濾規則,

使用【useDefaultFilters = false】:

package com.jektong.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import com.jektong.spring.Person;
@Configuration
@ComponentScan(value = "com.jektong",includeFilters  = {
		@Filter(type = FilterType.ANNOTATION,value= {Controller.class})
},useDefaultFilters = false )
public class PersonConfig {
	@Bean("person01")
	public Person person() {
		return new Person("李四",21);
	}
}

這樣就只會掃描用@Controller,標注的配置類交給Spring容器中了:

Spring之@ComponentScan自動掃描組件怎么使用

圖5

第二種:掃描包的時候可以排除一些注解配置類【excludeFilters】。

Spring之@ComponentScan自動掃描組件怎么使用

圖6

@Filter看上圖,有5種不同類型的過濾策略。拿第一種舉例,我們需要過濾使用@Controller注解的配置類:

package com.jektong.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import com.jektong.spring.Person;
@Configuration
@ComponentScan(value = "com.jektong",excludeFilters = {
		@Filter(type = FilterType.ANNOTATION,value= {Controller.class})
} )
public class PersonConfig {
	@Bean("person01")
	public Person person() {
		return new Person("李四",21);
	}
}

測試看一下發現圖2中的personController不會交給Spring容器去管理了:

Spring之@ComponentScan自動掃描組件怎么使用

圖7

上面的圖6展示出5種不同類型的過濾策略,上面介紹了注解類型(FilterType.ANNOTATION),還有四種:

重點看一下CUSTOM自定義掃描策略。

Spring之@ComponentScan自動掃描組件怎么使用

從源碼看,自定義掃描注解類型需要實現TypeFilter接口,下面就寫一個實現類MyFilter.java:在實現類中可以自定義配置規則:

package com.jektong.config;
import java.io.IOException;
import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;
public class MyFilter implements TypeFilter {
	@Override
	public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
			throws IOException {
		// 查看當前類的注解。
		AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
		// 查看當前掃描類的信息
		ClassMetadata classMetadata = metadataReader.getClassMetadata();
		// 獲取當前類資源
		Resource resource = metadataReader.getResource();
		String className = classMetadata.getClassName();
		System.out.println("className===>" + className);
		// 只要類名包含er則注冊Spring容器
		if(className.contains("er")) {
			return true;
		}
		return false;
	}
}

測試:

PersonConfig 中進行掃描:

package com.jektong.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import com.jektong.service.PersonService;
import com.jektong.spring.Person;
@Configuration
@ComponentScan(value = "com.jektong",includeFilters  = {
		@Filter(type = FilterType.CUSTOM,value= {MyFilter.class})
},useDefaultFilters = false )
public class PersonConfig {
	@Bean("person01")
	public Person person() {
		return new Person("李四",21);
	}
}

可以看出掃描出包下面的類只要帶“er”的全部掃描出來,并配置給Spring容器:

Spring之@ComponentScan自動掃描組件怎么使用

ASSIGNABLE_TYPE:按照指定的類型去加載對應配置類:

package com.jektong.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import com.jektong.service.PersonService;
import com.jektong.spring.Person;
@Configuration
@ComponentScan(value = "com.jektong",includeFilters  = {
		@Filter(type = FilterType.ASSIGNABLE_TYPE,value= {PersonService.class})
},useDefaultFilters = false )
public class PersonConfig {
	@Bean("person01")
	public Person person() {
		return new Person("李四",21);
	}
}

盡管我們將PersonService.java上的注解去掉,使用ASSIGNABLE_TYPE依然會加載出來(自行測試)。

ASPECTJ與REGEX基本不用,不用了解。

感謝各位的閱讀,以上就是“Spring之@ComponentScan自動掃描組件怎么使用”的內容了,經過本文的學習后,相信大家對Spring之@ComponentScan自動掃描組件怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德江县| 都匀市| 寿宁县| 基隆市| 荥经县| 贵溪市| 白河县| 怀远县| 永德县| 壶关县| 成都市| 乌审旗| 缙云县| 遂宁市| 普安县| 久治县| 乌拉特后旗| 当阳市| 尖扎县| 怀安县| 苏尼特右旗| 高州市| 内乡县| 明溪县| 平和县| 金门县| 万州区| 威海市| 桦南县| 锡林浩特市| 合肥市| 江华| 从江县| 文登市| 虎林市| 贡山| 盐亭县| 中阳县| 琼结县| 吉安县| 都江堰市|