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

Spring为IOC容器注入Bean的五种方式详解

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

Spring为IOC容器注入Bean的五种方式详解

这篇文章主要介绍了Spring为IOC容器注入Bean的五种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一 @import导入组件,id默认是组件的全类名

//类中组件统一设置。满足当前条件,这个类中配置的所有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();
  }

二 实现Condition进行注入

Springboot有大量的@ConditionXXXX注解

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;
  }
}

三 实现importSelector

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"};
  }
​
}

四 实现importBeanDefinitionRegistrar

public class MyimportBeanDefinitionRegistrar implements importBeanDefinitionRegistrar {
​
  
  @Override
  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);
    }
  }
}

五 实现 FactoryBean

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

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

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

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

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