springboot多种方式注入bean获取Bean

springboot动态注入bean

  • 1、创建Bean(demo)
  • 2、动态注入Bean
  • 3、通过注解注入Bean
  • 4、通过config配置注入Bean
  • 5、通过Import注解导入
  • 6、使用FactoryBean接口
  • 7、实现BeanDefinitionRegistryPostProcessor接口

1、创建Bean(demo)

@Data
public class Demo(){
	private String name;

	public void printName(){
		System.out.print("动态载入Bean的name属性"+this.name);
	}
}

2、动态注入Bean

@springbootTest
public class TestDemo(){
	@Test
	public void test(){
		// 获取ApplicationContext
		ApplicationContext context = (ApplicatonContext)SpringApplication.run(App.class,args);
		// 获取BeanFactory
		DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)context.getAutowireCapableBeanFactory();
		// 创建Bean信息
		BeanDefinitiontBuilder beanDefinitiontBuilder = BeandefinitionBuilder.genericBeanDefinition(Demo.class);
		beandefinitionBulider.addPropertyValue("name","小猫咪")// 注入Bean
		beanFactory.registerBeanDefinition("demo",beanDefinitionBuilder.getBeanDefinition());
		// 获取动态注入的Bean
		Demo demo = applicationContest.getBean("demo");
		demo.printName();
		// 移除动态注入的bean
		beanFactory.removeBeanDefinition("demo"); 
	}
}

3、通过注解注入Bean

直接在需要注入Bean的类上加这些注解

@RestController
@Service
@Component

4、通过config配置注入Bean

@Configuration标识这个类是一个配置类
@Bean表示这个方法返回的对象,和以前xml配置的Bean一样

5、通过Import注解导入

@import(xxx.class)可以嵌套在启动类上,也可以嵌套在config配置类上
@Import + 实现ImportSelector接口的selectImports方法
@Import + 实现ImportBeanDefinitionRegistrar 接口中的方法
@Import +  实现DeferredImportSelector接口的selectImports方法,DeferredImportSelector 它是 ImportSelector的子接口

6、使用FactoryBean接口

FactoryBean接口和BeanFactory千万不要弄混了,从名字其实可以大概的区分开,FactoryBean, 后缀为bean,那么它其实就是一个bean, BeanFactory,顾名思义 bean工厂,它是IOC容器的顶级接口,这俩接口都很重要。

package com.example.config;

import com.example.dto.Demo;
import org.springframework.beans.factory.FactoryBean;

public class DemoFactoryBean implements FactoryBean<Demo> {
    @Override
    public Bike getObject() throws Exception {
        return new Demo();
    }

    @Override
    public Class<?> getObjectType() {
        return Demo.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}
@Configuration
@Import({BikeFactoryBean.class,Dog.class,MyImportSelector.class})
public class MyConfig

7、实现BeanDefinitionRegistryPostProcessor接口

这种方式也是利用到了 BeanDefinitionRegistry,在Spring容器启动的时候会执行 BeanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry 方法,大概意思就是等beanDefinition加载完毕之后,对beanDefinition进行后置处理,可以在此进行调整IOC容器中的beanDefinition,从而干扰到后面进行初始化bean。

public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Demo.class).getBeanDefinition();
        registry.registerBeanDefinition("Demo", beanDefinition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
    }
}
@Configuration
@Import({MyBeanDefinitionRegistryPostProcessor.class})
public class MyConfig {

你可能感兴趣的:(java,spring,boot,java,spring)