spring注入容器

给容器中注册组件的方式:

包扫描+组件注解(@ ComponentScan等):局限于自己写的类

@Bean:导入的第三方包里面的组件

@Import(value=""):可以快速的给容器导入一个组     

1:value:要导入到容器中的组件(例如@Import(one.java),@Import({one.class,two.class})   

2:实现ImportSelector接口(myImportSelector.java):返回需要导入的组件的全类名数组:常   

3:实现ImportBeanDefinitionRegistrar接口(myImportBeanDefinitionRegistrar.java)     

4:使用spring提供的FactoryBean(工厂):也是实现这个接口:myFactoryBean.java

一:包扫描@ ComponentScan:

  * value:指定要扫描的包

  * excludeFilters;指定按照什么规则要排除的哪些组件;(exclude):排除

          举例:
    @ComponentScan(value = "com.lh",
                     excludeFilters = {

              @Filter(type
		= FilterType.ANNOTATION,classes = {Controller.class,Service.class} )

                     })

ludeFilters:指定按照什么规则只扫描哪些组件;(include):包括

  * 注意:要使用includeFilters,需要把默认的过滤规则禁用:useDefaultFilters=false等同于配置文件中的use-default-filters="false"
    @ComponentScan(value = "com.lh",

			includeFilters = {

	/*
	
	*
	@Filter(type=FilterType.ANNOTATION,classes={Configuration.class,Repository.class}),
	
	* @Filter(type =
	FilterType.ASSIGNABLE_TYPE,classes= {UserService.class}),
	
	*/
	
	@Filter(type = FilterType.CUSTOM,classes
	= {myTypeFilter.class})
	
	},
	
	useDefaultFilters = false
	
	)
	```

其中:
 
       * @Filter:过滤器:

      * type():按照类型:

      * FilterType.ANNOTATION:按照注解类型(比如:Controller.class):常用

              

      * FilterType.ASSIGNABLE_TYPE:按照指定的类型(比如UserService.class):常用

      * FilterType.ASPECTJ:按照ASPECTJ表达式:不常用

      * FilterType.REGEX:按照正则表达式:不常用

      * FilterType.CUSTOM:自定义规则,定义工具类:myTypeFilter.java

myTypeFilter.java工具类:要想自定义规则,首先需要实现“TypeFilter”接口,重写“match“方法,通过它里面的参数“metadataReader”可以读取到当前正在扫描的类的信息,使用你自定义的条件达到自定义规则的目的;例如:

```java
@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);

            if(className.contains("ser"))
{

                  return
true;

            }

            return false;

      }  

测试自定义规则注册组件:

@Test
public void myTest3() {

              AnnotationConfigApplicationContext
applicationContext=new
AnnotationConfigApplicationContext(myProfileConfig.class);

              String[] beanNamesForType =
applicationContext.getBeanNamesForType(DataSource.class);

              for
(String beanName : beanNamesForType) {

                     System.out.println(beanName);

                     //输出为:dataSourceTest,dataSourceDev,dataSourceProd

              }}
原文地址:https://www.cnblogs.com/JpfBlog66/p/14242512.html