栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring容器注册组件实现过程解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring容器注册组件实现过程解析

1、@Configuration&@Bean给容器中注册组件

@Configuration及@Bean的使用参考如下代码:

package com.atguigu.config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.ComponentScans;
 
import com.atguigu.bean.Person;
 
//配置类==配置文件
@Configuration //告诉Spring这是一个配置类
 
@ComponentScans(
    value = {
 @ComponentScan(value="com.atguigu",includeFilters = {

     @Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})
 },useDefaultFilters = false)  
    }
    )
//@ComponentScan value:指定要扫描的包
//excludeFilters = Filter[] :指定扫描的时候按照什么规则排除那些组件
//includeFilters = Filter[] :指定扫描的时候只需要包含哪些组件
//FilterType.ANNOTATION:按照注解
//FilterType.ASSIGNABLE_TYPE:按照给定的类型;
//FilterType.ASPECTJ:使用ASPECTJ表达式
//FilterType.REGEX:使用正则指定
//FilterType.CUSTOM:使用自定义规则
public class MainConfig {
   
  //给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id
  @Bean("person")
  public Person person01(){
    return new Person("lisi", 20);
  }
 
}

2、@ComponentScan-自动扫描组件&指定扫描规则

@CompoentScan的使用,参考1中以上代码即可。

3、自定义TypeFilter指定过滤规则

参考如下代码:

package com.atguigu.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 MyTypeFilter implements TypeFilter {
 
  
  @Override
  public boolean match(metadataReader metadataReader, metadataReaderFactory metadataReaderFactory)
      throws IOException {
    // TODO Auto-generated method stub
    //获取当前类注解的信息
    Annotationmetadata annotationmetadata = metadataReader.getAnnotationmetadata();
    //获取当前正在扫描的类的类信息
    Classmetadata classmetadata = metadataReader.getClassmetadata();
    //获取当前类资源(类的路径)
    Resource resource = metadataReader.getResource();
     
    String className = classmetadata.getClassName();
    System.out.println("--->"+className);
    if(className.contains("er")){
      return true;
    }
    return false;
  }
 
}

4、@Scope-设置组件作用域

参考如下代码:

5、@Lazy懒加载

6、@Conditional-按照条件注册bean

package com.atguigu.condition;
 
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypemetadata;
 
//判断是否linux系统
public class LinuxCondition implements Condition {
 
  
  public boolean matches(ConditionContext context, AnnotatedTypemetadata metadata) {
    // TODO是否linux系统
    //1、能获取到ioc使用的beanfactory
    ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
    //2、获取类加载器
    ClassLoader classLoader = context.getClassLoader();
    //3、获取当前环境信息
    Environment environment = context.getEnvironment();
    //4、获取到bean定义的注册类
    BeanDefinitionRegistry registry = context.getRegistry();
     
    String property = environment.getProperty("os.name");
     
    //可以判断容器中的bean注册情况,也可以给容器中注册bean
    boolean definition = registry.containsBeanDefinition("person");
    if(property.contains("linux")){
      return true;
    }
     
    return false;
  }
 
}

7、@import-给容器中快速导入一个组件

源代码如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface import {
 
  
  Class[] value();
 
}
package com.atguigu.config;
 
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.import;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
 
import com.atguigu.bean.Blue;
import com.atguigu.bean.Color;
import com.atguigu.bean.ColorFactoryBean;
import com.atguigu.bean.Person;
import com.atguigu.bean.Red;
import com.atguigu.condition.LinuxCondition;
import com.atguigu.condition.MyimportBeanDefinitionRegistrar;
import com.atguigu.condition.MyimportSelector;
import com.atguigu.condition.WindowsCondition;
import com.atguigu.test.IOCTest;
 
//类中组件统一设置。满足当前条件,这个类中配置的所有bean注册才能生效;
@Conditional({ WindowsCondition.class })
@Configuration
@import({ Color.class, Red.class, MyimportSelector.class, MyimportBeanDefinitionRegistrar.class })
// @import导入组件,id默认是组件的全类名
public class MainConfig2 {
 
  // 默认是单实例的
  
  // @Scope("prototype")
  @Lazy
  @Bean("person")
  public Person person() {
    System.out.println("给容器中添加Person....");
    return new Person("张三", 25);
  }
 
  
 
  @Bean("bill")
  public Person person01() {
    return new Person("Bill Gates", 62);
  }
 
  @Conditional(LinuxCondition.class)
  @Bean("linus")
  public Person person02() {
    return new Person("linus", 48);
  }
 
  
  @Bean
  public ColorFactoryBean colorFactoryBean() {
    return new ColorFactoryBean();
  }
 
}

8、@import-使用importSelect

8.1 配置如下:

8.2对应的类需实现importSelector接口

package com.atguigu.condition;
 
import org.springframework.context.annotation.importSelector;
import org.springframework.core.type.Annotationmetadata;
 
//自定义逻辑返回需要导入的组件
public class MyimportSelector implements importSelector {
 
  //返回值,就是到导入到容器中的组件全类名
  //Annotationmetadata:当前标注@import注解的类的所有注解信息
  public String[] selectimports(Annotationmetadata importingClassmetadata) {
    // TODO Auto-generated method stub
    //importingClassmetadata
    //方法不要返回null值
    return new String[]{"com.atguigu.bean.Blue","com.atguigu.bean.Yellow"};
  }
 
}

9、@import-使用importBeanDefinitionRegistrar

9.1配置如下:

9.2对应的类需实现importBeanDefinitionRegistrar接口

package com.atguigu.condition;
 
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.importBeanDefinitionRegistrar;
import org.springframework.core.type.Annotationmetadata;
 
import com.atguigu.bean.RainBow;
 
public class MyimportBeanDefinitionRegistrar implements importBeanDefinitionRegistrar {
 
  
  public void registerBeanDefinitions(Annotationmetadata importingClassmetadata, BeanDefinitionRegistry registry) {
     
    boolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red");
    boolean definition2 = registry.containsBeanDefinition("com.atguigu.bean.Blue");
    if(definition && definition2){
      //指定Bean定义信息;(Bean的类型,Bean。。。)
      RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
      //注册一个Bean,指定bean名
      registry.registerBeanDefinition("rainBow", beanDefinition);
    }
  }
 
}

10、使用FactoryBean注册组件

10.1 配置如下:

10.2对应的类需实现org.springframework.beans.factory.FactoryBean接口

package com.atguigu.bean;
 
import org.springframework.beans.factory.FactoryBean;
 
//创建一个Spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean {
 
  //返回一个Color对象,这个对象会添加到容器中
  public Color getObject() throws Exception {
    // TODO Auto-generated method stub
    System.out.println("ColorFactoryBean...getObject...");
    return new Color();
  }
 
  public Class getObjectType() {
    // TODO Auto-generated method stub
    return Color.class;
  }
 
  //是单例?
  //true:这个bean是单实例,在容器中保存一份
  //false:多实例,每次获取都会创建一个新的bean;
  public boolean isSingleton() {
    // TODO Auto-generated method stub
    return false;
  }
 
}

11、给容器中注册组件-总结

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/134688.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号