看公司的源代码,在一个类中使用到了BeanDefinitionBuilder这个类,在学习之后才知道在项目中可能没有注册bean,在使用的时候才会进行注册,就涉及到了动态bean的注册,所以,在文章中会整理一下关于这方面的知识。
2017.12.22,这篇文档还有些难,下次复习时再研究一下这篇文档:https://www.cnblogs.com/hanjiehu/p/5978260.html
一:概述
1.目录
2.知识点
Spring 2.0 增加了 BeanDefinitionBuilder ,通过 BeanDefinitionBuilder 可以动态的创建一个Applicatoin Context 而不需要使用XML。
二:程序
1.User.java
1 package cn.caojun.spring; 2 3 public class User { 4 private String username; 5 private String password; 6 7 public String getUsername() { 8 return username; 9 } 10 11 public void setUsername(String username) { 12 this.username = username; 13 } 14 15 public String getPassword() { 16 return password; 17 } 18 19 public void setPassword(String password) { 20 this.password = password; 21 } 22 23 @Override 24 public String toString() { 25 return "User{" + 26 "username='" + username + '\'' + 27 ", password='" + password + '\'' + 28 '}'; 29 } 30 }
2.UserService
1 package cn.caojun.spring; 2 3 public class UserService { 4 private User user; 5 6 public void test(){ 7 System.out.println(user.getUsername()+"--------------------"); 8 } 9 10 public User getUser() { 11 return user; 12 } 13 14 public void setUser(User user) { 15 this.user = user; 16 } 17 }
3.applicationContext.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 <bean id="SpringDemo" class="cn.caojun.spring.SpringDemo"></bean> 6 </beans>
4.SpringDemo.java
1 package cn.caojun.spring; 2 3 import org.springframework.beans.BeansException; 4 import org.springframework.beans.factory.BeanFactory; 5 import org.springframework.beans.factory.BeanFactoryAware; 6 import org.springframework.beans.factory.support.BeanDefinitionBuilder; 7 import org.springframework.beans.factory.support.DefaultListableBeanFactory; 8 import org.springframework.context.ApplicationContext; 9 import org.springframework.context.ApplicationListener; 10 import org.springframework.context.ConfigurableApplicationContext; 11 import org.springframework.context.event.ContextRefreshedEvent; 12 import org.springframework.context.support.ClassPathXmlApplicationContext; 13 14 public class SpringDemo implements BeanFactoryAware, ApplicationListener<ContextRefreshedEvent> { 15 16 private DefaultListableBeanFactory beanFactory; 17 18 /** 19 * 主函数 20 * @param args 21 */ 22 public static void main(String[] args) { 23 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); 24 将applicationContext转换为ConfigurableApplicationContext 25 ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext; 26 获取bean工厂并转换为DefaultListableBeanFactory 27 DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory(); 28 System.out.println("ContextRefreshed**"); 29 //获取bean 30 User user=(User) defaultListableBeanFactory.getBean("user"); 31 String userName=user.getUsername(); 32 String password=user.getPassword(); 33 System.out.println("userName="+userName+","+"password="+password); 34 } 35 36 /** 37 *BeanFactory转换为DefaultListableBeanFactory 38 * @param beanFactory 39 * @throws BeansException 40 */ 41 public void setBeanFactory(BeanFactory beanFactory) throws BeansException { 42 System.out.println("setBeanFactory=="); 43 this.beanFactory = (DefaultListableBeanFactory) beanFactory; 44 } 45 46 /** 47 * 48 * @param contextRefreshedEvent 49 */ 50 public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { 51 System.out.println("ContextRefreshed--"); 52 BeanDefinitionBuilder userBeanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class); 53 userBeanDefinitionBuilder.addPropertyValue("username", "chinfeng"); 54 userBeanDefinitionBuilder.addPropertyValue("password", "123456"); 55 beanFactory.registerBeanDefinition("user", userBeanDefinitionBuilder.getRawBeanDefinition()); 56 System.out.println("ContextRefreshed++"); 57 BeanDefinitionBuilder usersBeanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserService.class); 58 usersBeanDefinitionBuilder.addPropertyReference("user", "user"); 59 //beanFactory.registerBeanDefinition("userService", usersBeanDefinitionBuilder.getRawBeanDefinition()); 60 } 61 }
5.效果