您的位置:首页 > 编程语言 > Java开发

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

2017-12-21 22:54 369 查看
看公司的源代码,在一个类中使用到了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.效果

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: