自定义通配器导入bean对象
生活随笔
收集整理的這篇文章主要介紹了
自定义通配器导入bean对象
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.CustomerImportSelector工具類:
/*** @description : 自動導(dǎo)入器* @author : wanYunBo* @date : 2021-09-02 20:46**/ package com.itheima.config.selector;import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ImportSelector; import org.springframework.core.io.support.PropertiesLoaderUtils; import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.filter.AspectJTypeFilter; import org.springframework.core.type.filter.TypeFilter;import java.io.IOException; import java.util.*;public class CustomerImportSelector implements ImportSelector {private String expression;public CustomerImportSelector(){try {//初始化時指定加載的properties文件名,就是你文件名Properties loadAllProperties = PropertiesLoaderUtils.loadAllProperties("import2.properties");//設(shè)定加載的屬性名,就是類似Myclass=com.lzb.dao.UserDao,com.lzb.dao.PersonDao//****就對應(yīng)key的值(className)expression = loadAllProperties.getProperty("className");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {//1.定義掃描包的名稱String[] basePackages = null;//2.判斷有@Import注解的類上是否有@ComponentScan注解if (importingClassMetadata.hasAnnotation(ComponentScan.class.getName())) {//3.取出@ComponentScan注解的屬性Map<String, Object> annotationAttributes = importingClassMetadata.getAnnotationAttributes(ComponentScan.class.getName());//4.取出屬性名稱為basePackages屬性的值basePackages = (String[]) annotationAttributes.get("basePackages");}//5.判斷是否有此屬性(如果沒有ComponentScan注解則屬性值為null,如果有ComponentScan注解,則basePackages默認為空數(shù)組)if (basePackages == null || basePackages.length == 0) {String basePackage = null;try {//6.取出包含@Import注解類的包名basePackage = Class.forName(importingClassMetadata.getClassName()).getPackage().getName();} catch (ClassNotFoundException e) {e.printStackTrace();}//7.存入數(shù)組中basePackages = new String[] {basePackage};}//8.創(chuàng)建類路徑掃描器ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);//9.創(chuàng)建類型過濾器(此處使用切入點表達式類型過濾器)TypeFilter typeFilter = new AspectJTypeFilter(expression,this.getClass().getClassLoader());//10.給掃描器加入類型過濾器scanner.addIncludeFilter(typeFilter);//11.創(chuàng)建存放全限定類名的集合Set<String> classes = new HashSet<>();//12.填充集合數(shù)據(jù)for (String basePackage : basePackages) {scanner.findCandidateComponents(basePackage).forEach(beanDefinition -> classes.add(beanDefinition.getBeanClassName()));}//13.按照規(guī)則返回return classes.toArray(new String[classes.size()]);}}2.import2.properties屬性文件
- 表示className=com.itheima.dao.impl下的bean對象不需要用@Repository("")配置,自動導(dǎo)入
- 應(yīng)用場景,接口實現(xiàn)類較多,可采用導(dǎo)入器自動注入
3.導(dǎo)入SpringConfig類中加載
@Import(CustomerImportSelector.class)//將分配置文件引進來 public class SpringConfig { }4.所需classpath依賴
<!--通配導(dǎo)入器 classpath依賴--><dependency><groupId> org.aspectj</groupId ><artifactId> aspectjweaver</artifactId ><version> 1.8.7</version ></dependency>總結(jié)
以上是生活随笔為你收集整理的自定义通配器导入bean对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自相矛盾告诉我们的道理是什么 自相矛盾故
- 下一篇: 动态代理-AOP