目的:
在程序運行期間,動態添加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 + '}'; } }
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()); } }
流程:
在對Bean進行初始化設置時,是通過構造函數進行初始化(要按照構造函數參數順序進行賦值)還是通過屬性進行初始化或者是兩者都可以,這完全取決於要動態注入的Bean。