SpringBoot動態注入Bean


目的:

在程序運行期間,動態添加Bean進入到Spring容器。

目前使用到的場景:

對當當網的ElasticJob進行封裝,通過自定義注解@ElasticJob的方式開啟分布式定時任務。

當所有的Bean都初始化完成之后,讀取使用了@ElasticJob注解的所有Bean,然后創建SpringJobSchedule實例並添加到Spring容器中,實現任務的啟動。

實現方式:

1.新建一個普通的Java類

public class Animal {
    private String name;
    private String color;
    private byte age;

    public Animal(String name, String color, byte age) {
        this.name = name;
        this.color = color;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public byte getAge() {
        return age;
    }

    public void setAge(byte age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", color='" + color + '\'' +
                ", age=" + age +
                '}';
    }
}
View Code

2.通過DefaultListableBeanFactory和BeanDefinitionBuilder實現Bean的動態注入

@SpringBootApplication(scanBasePackages = {"org.example.*"})
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(Application.class);
        DefaultListableBeanFactory autowireCapableBeanFactory = (DefaultListableBeanFactory) run.getAutowireCapableBeanFactory();
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(Animal.class);
        beanDefinitionBuilder.addConstructorArgValue("喜鵲").addConstructorArgValue("綠色").addConstructorArgValue(3);
        String beanName = "AnimalAutoName";
        //默認單例
        beanDefinitionBuilder.setScope("prototype");
        autowireCapableBeanFactory.registerBeanDefinition(beanName, beanDefinitionBuilder.getBeanDefinition());
        Object bean = run.getBean(beanName);
        Animal animal = (Animal) bean;
        System.out.println(animal.getAge());
        System.out.println(animal.getColor());
        System.out.println(animal.getName());
    }
}
View Code

流程:

 

 在對Bean進行初始化設置時,是通過構造函數進行初始化(要按照構造函數參數順序進行賦值)還是通過屬性進行初始化或者是兩者都可以,這完全取決於要動態注入的Bean。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM