spring 动态bean注册

1、

import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;

import java.util.Date;

/**
 * @author www.gomepay.com
 * @date 2019/11/14
 */
public class GenericBeanDefinitionExample {
    public static void main (String[] args) {
        DefaultListableBeanFactory context = new DefaultListableBeanFactory();

        GenericBeanDefinition gbd = new GenericBeanDefinition();
        gbd.setBeanClass(MyBean.class);

        MutablePropertyValues mpv = new MutablePropertyValues();
        mpv.add("date", new Date());

        //alternatively we can use:
        // gbd.getPropertyValues().addPropertyValue("date", new Date());
        gbd.setPropertyValues(mpv);

        context.registerBeanDefinition("myBeanName", gbd);

        MyBean bean = context.getBean(MyBean.class);
        bean.doSomething();
    }
}public class MyBean {
    private Date date;

    public void doSomething () {
        System.out.println("from my bean, date: " + date);
    }

    public void setDate (Date date) {
        this.date = date;
    }
}

输出:from my bean, date: Fri Nov 15 14:16:37 GMT+08:00 2019

2、

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;

/**
 * @author www.gomepay.com
 * @date 2019/11/15
 */
public class BeanDefinitionBuilderExample {
    public static void main (String[] args) {
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        BeanDefinitionBuilder b =
                BeanDefinitionBuilder.rootBeanDefinition(MyBean.class)
                        .addPropertyValue("str", "myStringValue");
        beanFactory.registerBeanDefinition("myBean", b.getBeanDefinition());

        MyBean bean = beanFactory.getBean(MyBean.class);
        bean.doSomething();
    }
}
public class MyBean {
    private String str;

    public void setStr (String str) {
        this.str = str;
    }

    public void doSomething () {
        System.out.println("from MyBean " + str);
    }
}

输出:from MyBean myStringValue

3、

import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;

/**
 * @author www.gomepay.com
 * @date 2019/11/15
 */
public class InjectingOtherBeans {
    public static void main(String[] args) {
        DefaultListableBeanFactory context = new DefaultListableBeanFactory();
        //define and register MyOtherBean
        GenericBeanDefinition beanOtherDef = new GenericBeanDefinition();
        beanOtherDef.setBeanClass(MyOtherBean.class);
        context.registerBeanDefinition("other", beanOtherDef);

        //definine and register myBean
        GenericBeanDefinition beanDef = new GenericBeanDefinition();
        beanDef.setBeanClass(MyBean.class);
        MutablePropertyValues mpv = new MutablePropertyValues();
        mpv.addPropertyValue("otherBean", context.getBean("other"));
        beanDef.setPropertyValues(mpv);
        context.registerBeanDefinition("myBean", beanDef);

        //using MyBean instance
        MyBean bean = context.getBean(MyBean.class);
        bean.doSomething();
    }
}
class MyBean {
    private MyOtherBean otherBean;

    public void setOtherBean (MyOtherBean otherBean) {
        this.otherBean = otherBean;
    }

    public void doSomething () {
        otherBean.doSomething();
    }
}
class MyOtherBean {
    public void doSomething () {
        System.out.println("from other bean ");
    }
}

输出:from other bean 

4、

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;

public class MyConfigBean implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory (
            ConfigurableListableBeanFactory beanFactory)
            throws BeansException {
        GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setBeanClass(MyBean.class);
        bd.getPropertyValues().add("strProp", "my string property");
        ((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("myBeanName", bd);
    }
}
@Configuration
class MyConfig {
    @Bean
    MyConfigBean myConfigBean () {
        return new MyConfigBean();
    }
}
class MyBean {
    private String strProp;

    public void setStrProp (String strProp) {
        this.strProp = strProp;
    }

    public void doSomething () {
        System.out.println("from MyBean:  " + strProp);
    }
}
public class BeanFactoryPostProcessorExample {
    public static void main (String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(MyConfig.class);
        MyBean bean = context.getBean(MyBean.class);
        bean.doSomething();
    }
}

输出:from MyBean:  my string property

5、

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;

public class MyConfigBean implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry (BeanDefinitionRegistry registry)
            throws BeansException {
        GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setBeanClass(MyBean.class);
        bd.getPropertyValues().add("strProp", "my string property");
        registry.registerBeanDefinition("myBeanName", bd);
    }
    @Override
    public void postProcessBeanFactory (ConfigurableListableBeanFactory beanFactory)
            throws BeansException {
        //no op
    }
}
@Configuration
public class MyConfig {
    @Bean
    MyConfigBean myConfigBean () {
        return new MyConfigBean();
    }
}
public class MyBean {
    private String strProp;
    public void setStrProp (String strProp) {
        this.strProp = strProp;
    }
    public void doSomething () {
        System.out.println("from MyBean:  " + strProp);
    }
}
public class BeanDefinitionRegistryPostProcessorExample {
    public static void main (String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(MyConfig.class);
        MyBean bean = (MyBean) context.getBean("myBeanName");
        bean.doSomething();
    }
}

输出:from MyBean:  my string property

原文地址:https://www.cnblogs.com/yaoyuan2/p/11866207.html