美文网首页
手动向Spring容器中注入对象

手动向Spring容器中注入对象

作者: 倚仗听江 | 来源:发表于2020-08-19 09:58 被阅读0次

手动向Spring容器中注入对象的方法有很多,本文将简单阐述其中的四种

1. beanFactory的registerSingleton方法

我们可以实现一个BeanFactory的后置处理器,在其中就可以获得BeanFactory,这样就可以调用registerSingleton方法。
注:此处bean的名字可以自定义,如这里就定义为sherlock。

@Component
public class SherlockBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

        beanFactory.registerSingleton("sherlock", new User("sherlock", 18));

    }
}

如果在容器中获取该类

@Test
    public void test() {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        User sherlock = context.getBean("sherlock", User.class);
        System.out.println(sherlock.toString());
    }

控制台输出:


image.png

对象就已成功注入到Spring容器中了。
注:其实在context中也有registerBean方法,可以实现一样的效果。(ApplicationContext其实继承了BeanFactory,所以它也拥有Bean工厂的功能,除此之外ApplicationContext还继承了很多其他的类,拥有一些辅助功能。总的来说,ApplicationContext其实包括了BeanFactory)

2. @Bean注解

在配置类中,使用@Bean注解,返回一个想要注入的对象。@Bean括号中是bean的名字,默认为类名的小写形式。

@Configuration
@ComponentScan("com.sherlock")
public class AppConfig {

    @Bean("sherlock")
    public User user() {
        return new User("sherlock", 19);
    }

}

控制台输出:


image.png

3. 使用Factory‘Bean

既然提到了Factory‘Bean,就不得不提到BeanFactory。关于这两个的区别,可以看下我的另一篇文章。https://www.jianshu.com/p/91d21128d2a9
我们可以创建一个类去实现FactoryBean接口

@Component
public class SherlockFactoryBean implements FactoryBean {

    @Override
    public Object getObject() throws Exception {
        return new User("sherlock", 20);
    }

    @Override
    public Class<?> getObjectType() {
        return User.class;
    }
}
//注意:这个bean的名字是sherlockFactoryBean,但返回的是User类
 User user = context.getBean("sherlockFactoryBean", User.class);

控制台输出:


image.png

4. 使用@Import注解

@Import只能用在类上 ,@Import通过快速导入的方式实现把实例加入spring的IOC容器中
@Import的三种用法主要包括:

  1. 直接填class数组
@Import({User.class, Order.class})
User user = context.getBean("com.sherlock.pojo.User", User.class);

注意:这样注入的类名为类的全限定名。

  1. ImportSelector方式
    使用这种方式的这个类必须实现ImportSelector接口
public class SherlockImportSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        //前面可以是和业务相关的逻辑
        //返回需要导入的组件的全类名数组
        return new String[]{"com.sherlock.pojo.User"};
    }
}
  1. ImportBeanDefintionRegister方式手动注册bean
public class SherlockImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //需要的业务逻辑
        //指定bean定义信息(包括bean的类型、作用域...)
        RootBeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClass(User.class);
        registry.registerBeanDefinition("user",beanDefinition);
    }
}

@Import三种方式的总结
第一种用法:@Import({ 要导入的容器中的组件 } ):容器会自动注册这个组件,id默认是全类名
第二种用法:ImportSelector:返回需要导入的组件的全类名数组,springboot底层用的特别多。
第三种用法:ImportBeanDefinitionRegistrar:手动注册bean到容器


好了,以上就是四种手动向Spring容器中注入对象的方法。总结一下吧,分别是:

  1. beanFactory的registerSingleton方法
  2. @Bean注解
  3. FactoryBean
  4. @Import

相关文章

  • 手动向Spring容器中注入对象

    手动向Spring容器中注入对象的方法有很多,本文将简单阐述其中的四种 1. beanFactory的regist...

  • spring_IOC总结(二)--xml依赖注入

    spring的bean对象--依赖注入 spring 创建bean对象细节 配置spring核心容器xml配置文件...

  • Spring 学习笔记(二):Spring 容器以及 bean

    Spring 容器 在 Spring 应用中,应用对象生存于 Spring 容器中,Spring 容器负责创建对象...

  • Spring2-Spring IoC容器和bean

    Spring IoC容器和bean Spring IoC容器 IoC也称为依赖注入(DI),可以帮我们创建对象 管...

  • spring 学习02

    Spring 容器 在Spring 应用中,你的应用对象生存在Spring容器中,Spring 容器负责创建对象,...

  • Spring-DI

    Spring利用依赖注入(DI),完成对IOC容器中中各个对象的依赖关系赋值;具体注入规则如下: 默认优先按照类型...

  • 注解

    依赖注入的注解的原理: 1、当启动spring容器的时候,创建两个对象2、当spring容器解析到 spring容...

  • 【Spring源码】IOC容器源码分析(二)

    容器的创建 总结Spring 容器在启动时,首先保存注册到容器中的Bean的定义信息注解注入xml注入Spring...

  • spring知识点

    spring是一个容器,可以将任何对象的初始化过程交给spring容器来管理,通过spring的IOC机制注入到s...

  • SpringBoot 普通类中获取Bean对象(dao、serv

    前言 如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spri...

网友评论

      本文标题:手动向Spring容器中注入对象

      本文链接:https://www.haomeiwen.com/subject/lkuhjktx.html