Spring中如何动态注册bean,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
十多年的加查网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整加查建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“加查网站设计”,“加查网站推广”以来,每个客户项目都认真落实执行。
大部分时候,静态的配置信息即可满足系统需求。但是某些场景下,我们需要根据静态配置中的信息动态生成bean,此时就需要动态注册bean的功能。
如:
用户定义一个如下的接口,而接口的实现则由框架生成,不需要用户自行编写,此时实现类就需要动态注册到容器中。
@Rest("http://localhost:8081/test")public interface IRequestDemo {@GETResultBean get1();@GET("/get2")ResultBean getWithKey(@Param("key") String key);@GET("/get3")ResultBean getWithMultKey(@Param("key1") String key, @Param("key2") String key2);}@componetpublic class test { @Autowired IRequestDemo demo; public String test() {String msg = "invoke remote rest result
";ResultBean get1 = demo.get1();msg += "
get1 result=" + get1;ResultBean get2 = demo.getWithKey("key-------");msg += "
get2 result=" + get2;ResultBean get3 = demo.getWithMultKey("key11111", "key22222");msg += "
get3 result=" + get3;return msg; }}
代码片段来自我同事[晓风轻][1]的项目[MyRestUtil][2]
Spring中的bean定义都保存在 **BeanDefinitionRegistry** 接口中,单例的bean的实例都保存在 **SingletonBeanRegistry** 接口中。
因此动态注册bean也分为了两种方式:
1. 使用BeanDefinitionRegistry接口的void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException 方法
2. 使用SingletonBeanRegistry接口的void registerSingleton(String beanName, Object singletonObject) 方法
两者区别在于使用前者时,Spring容器会根据BeanDefinition实例化bean实例,而使用后者时,bean实例就是传递给registerSingleton方法的对象。
DefaultListableBeanFactory接口同时实现了这两个接口,在实践中通常会使用这个接口。
可以在任何获得了BeanDefinitionRegistry或者SingletonBeanRegistry实例的地方进行动态注册。
但是如果bean不是在BeanFactoryPostProcessor中被注册,那么该bean则无法被**BeanPostProcessor**处理,即无法对其应用aop、Bean Validation等功能。
在**BeanFactoryPostProcessor**中进行动态注册
在Spring容器的启动过程中,BeanFactory载入bean的定义后会立刻执行BeanFactoryPostProcessor,此时动态注册bean,则可以保证动态注册的bean被BeanPostProcessor处理,并且可以保证其的实例化和初始化总是先于依赖它的bean。
例子
在BeanFactoryPostProcessor注册
@Component@Slf4jpublic class PersonBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {DefaultListableBeanFactory defaultListableBeanFactory= (DefaultListableBeanFactory) beanFactory;//注册Bean定义,容器根据定义返回bean log.info("register personManager1>>>>>>>>>>>>>>>>");BeanDefinitionBuilder beanDefinitionBuilder =BeanDefinitionBuilder.genericBeanDefinition(PersonManager.class);beanDefinitionBuilder.addPropertyReference("personDao", "personDao");BeanDefinition personManagerBeanDefinition = beanDefinitionBuilder.getRawBeanDefinition();defaultListableBeanFactory.registerBeanDefinition("personManager1", personManagerBeanDefinition);//注册bean实例 log.info("register personManager2>>>>>>>>>>>>>>>>");PersonDao personDao = beanFactory.getBean(PersonDao.class);PersonManager personManager = new PersonManager();personManager.setPersonDao(personDao);beanFactory.registerSingleton("personManager2", personManager);}}
在普通bean中注册
@RestController@Slf4jpublic class PersonManagerRegisterController {/** * The Application context. */@AutowiredGenericApplicationContext applicationContext;/** * The Bean factory. */@AutowiredConfigurableBeanFactory beanFactory;/** * 动态注册bean,此处注册的bean没有AOP的支持 * curl http://localhost:8080/registerPersonManager */@GetMapping("/registerPersonManager")public void registerPersonManager() {PersonDao personDao = applicationContext.getBean(PersonDao.class);PersonManager personManager = new PersonManager();personManager.setPersonDao(personDao);beanFactory.registerSingleton("personManager3", personManager);}... ...
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。