spring中注册bean(通过代码动态注册)

看公司的源代码,在一个类中使用到了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.效果

  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值