BeanFactory動(dòng)態(tài)注入到Interface
1、首先定義承載對(duì)象的接口;
public interface Bean {}
2、定義BeanFactory,實(shí)現(xiàn)getObject方法。
public class MyBeanFactoryimplements FactoryBean{private String name;private String age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public static final Mapmap=new HashMap<>();public T getObject() throws Exception {if (CollectionUtils.isEmpty(map)||!map.containsKey("lele")){synchronized (map){return (T) execute();}}else{return (T) map.get("lele");}}private Object execute() {Mybean mybean = new Mybean(name,age);map.put("lele",mybean);return mybean;}public Class getObjectType() {return null;}public boolean isSingleton() {return FactoryBean.super.isSingleton();}}
3、將BeanFactory注入到ioc容器。
public class MyBeanFactoryBean extends MyBeanFactory{}
Spring注入bean裝配廠工具類
public class MySpringContentUtils {public static ConfigurableApplicationContext context;public static ConfigurableApplicationContext getContext() {return context;}public static void setContext(ConfigurableApplicationContext context) {MySpringContentUtils.context = context;}public static void registerBean(String name, Class factoryClazz, Class beanClazz, MutablePropertyValues mpv) throws BeanDefinitionStoreException {BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(beanClazz);GenericBeanDefinition beanDefinition = (GenericBeanDefinition)beanDefinitionBuilder.getRawBeanDefinition();beanDefinition.setBeanClass(factoryClazz == null ? beanClazz : factoryClazz);beanDefinition.setPropertyValues(mpv);BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry)context.getBeanFactory();beanFactory.registerBeanDefinition(name, beanDefinition);}public staticT getBean(String name) throws BeansException {return (T) context.getBean(name);}}
將MyBeanFactory注入到beanDefianition中
public class MyConfig implements BeanDefinitionRegistryPostProcessor {public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {MutablePropertyValues mv=new MutablePropertyValues();mv.add("name","jasldf");mv.add("age","123");MySpringContentUtils.registerBean("jk",MyBeanFactoryBean.class,Mybean.class,mv);}????public?void?postProcessBeanFactory(ConfigurableListableBeanFactory?configurableListableBeanFactory)?throws?BeansException?{}}
public?class?MyTianApplicationInitlize?implements?ApplicationContextInitializer?{@Overridepublic void initialize(ConfigurableApplicationContext configurableApplicationContext) {MySpringContentUtils.setContext(configurableApplicationContext);}}

至此,我們需要的功能就已經(jīng)寫(xiě)完了。這里我們測(cè)試一下。

測(cè)試如下;


評(píng)論
圖片
表情
