zoukankan      html  css  js  c++  java
  • 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
    
                  }}
  • 相关阅读:
    背景图
    PKUWC 2019~2020 游记
    前置内容2:复杂度分析
    前置内容1:算法与数据结构
    莫比乌斯反演学习笔记2
    莫比乌斯反演学习笔记1
    CSP-J&S-2019 游记
    最近面试的一些感触
    算法学习-整数反转
    入行九年,入园8年,突然想写一点东西.
  • 原文地址:https://www.cnblogs.com/JpfBlog66/p/14242512.html
Copyright © 2011-2022 走看看