`

101. Spring Boot轻松理解动态注入,删除bean【从零开始学Spring Boot】

阅读更多

视频&交流平台

à SpringBoot网易云课堂视频

http://study.163.com/course/introduction.htm?courseId=1004329008

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

 

      我们通过getBean来获得对象,但这些对象都是事先定义好的,我们有时候要在程序中动态的加入对象.因为如果采用配置文件或者注解,我们要加入对象的话,还要重启服务,如果我们想要避免这一情况就得采用动态处理bean,包括:动态注入,动态删除。

 

本节大纲 :
(1)动态注入bean思路;
(2)动态注入实现代码;
(3)多次注入同一个bean的情况;
(4)动态删除;

 

       接下来我们看下具体的内容:

 

1)动态注入bean思路;

       在具体进行代码实现的时候,我们要知道,Spring管理bean的对象是BeanFactory,具体的是DefaultListableBeanFactory,在这个类当中有一个注入bean的方法:registerBeanDefinition,在调用registerBeanDefinition方法时,需要BeanDefinition参数,那么这个参数怎么获取呢?Spring提供了BeanDefinitionBuilder可以构建一个BeanDefinition,那么我们的问题就是如何获取BeanFactory了,这个就很简单了,只要获取到ApplicationContext对象即可获取到BeanFacory了。

 

2)动态注入实现代码;

综上所述,如果我们要编写一个简单里的例子的话,那么分以个几个步骤进行编码即可进行动态注入了:

 
<1>. 获取ApplicationContext;
<2>. 通过ApplicationContext获取到BeanFacotory;
<3>. 通过BeanDefinitionBuilder构建BeanDefiniton;
<4>. 调用beanFactory的registerBeanDefinition注入beanDefinition;
<5>. 使用ApplicationContext.getBean获取bean进行测试;

 

 

       很明显我们需要先定义个类进行测试,比如TestService代码如下:

 /**
 * 动态注入的service.
 * @author Angel -- 守护天使
 * @version v.0.1
 * @date 2017年1月2日
 */
package com.kfit.demo.service;
public class TestService {
    private String name;
    public String getName() {
       return name;
    }
    public void setName(String name) {
       this.name = name;
    }
    public void print(){
       System.out.println("动态载入bean,name="+name);
    }
}

 

 

注意:这里没有使用@Service和配置文件进行注入TestService

 

       那么下面我们的目标就是动态注入TestService了,根据以上的分析,我们进行编码,具体代码如下:

 
//获取context.  -- Angel -守护天使
ApplicationContext ctx =  (ApplicationContext) SpringApplication.run(App.class, args);
      
//获取BeanFactory
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) ctx.getAutowireCapableBeanFactory();
      
//创建bean信息.
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(TestService.class);
beanDefinitionBuilder.addPropertyValue("name","张三");
      
//动态注册bean.
defaultListableBeanFactory.registerBeanDefinition("testService", beanDefinitionBuilder.getBeanDefinition());
      
//获取动态注册的bean.
TestService testService =ctx.getBean(TestService.class);、testService.print();

 

 

 

执行代码我们会在控制台看到如下打印信息:

动态载入bean,name=张三

       到这里,就证明我们的代码很成功了。

 

3)多次注入同一个bean的情况;

       多次注入同一个bean的,如果beanName不一样的话,那么会产生两个Bean;如果beanName一样的话,后面注入的会覆盖前面的。

第一种情况:beanName一样的代码:

 

beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(TestService.class);
beanDefinitionBuilder.addPropertyValue("name","李四");
defaultListableBeanFactory.registerBeanDefinition("testService", beanDefinitionBuilder.getBeanDefinition());

 

 

 

       运行看控制台:

动态载入bean,name=李四

 

第二种情况:beanName不一样的代码:

 
beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(TestService.class);
beanDefinitionBuilder.addPropertyValue("name","李四");
defaultListableBeanFactory.registerBeanDefinition("testService1", beanDefinitionBuilder.getBeanDefinition());

 

 

       此时如果没有更改别的代码直接运行的话,是会报如下错误的:

 

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.kfit.demo.service.TestService] is defined: expected single matching bean but found 2: testService1,testService

 

 

 

       大体意思就是在getBean的时候,找到了两个bean,这时候就不知道要获取哪个了,所以在获取的时候,我们就要指定我们是要获取的testService还是testService1,只需要修改一句代码:

将代码:

 

TestService testService =ctx.getBean(TestService.class);

  

修改为:

 

 

TestService testService =ctx.getBean("testService");

  

 

 

 

4)动态删除;

       相对于动态注入,动态删除就很简单了,直接奉上代码:

 
//删除bean.
defaultListableBeanFactory.removeBeanDefinition("testService");

 

 

 

 视频&交流平台

à SpringBoot网易云课堂视频

http://study.163.com/course/introduction.htm?courseId=1004329008

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

 

分享到:
评论
8 楼 林祥纤 2017-07-07  
颖宝blingbling 写道
说真的我排版做多也就这样了,页面这方面一直是缺点.
不过真的偶尔有些的排版有种看不下去的感觉,哈哈哈。
支持楼主,慢慢来


感谢支持。
7 楼 颖宝blingbling 2017-07-06  
说真的我排版做多也就这样了,页面这方面一直是缺点.
不过真的偶尔有些的排版有种看不下去的感觉,哈哈哈。
支持楼主,慢慢来
6 楼 林祥纤 2017-04-09  
nucleus 写道
博主的排版还是一如既往啊...


我还真不太会布局,你可以教我下嘛?
5 楼 nucleus 2017-04-09  
博主的排版还是一如既往啊...
4 楼 林祥纤 2017-01-11  
lixuejian 写道
这个可以有。



^_^
3 楼 lixuejian 2017-01-05  
这个可以有。
2 楼 林祥纤 2017-01-03  
k88520 写道
厉害 动态可以扩展很多方法和思路啊


嗯,是的,比如:动态添加一个定时器之类的。
1 楼 k88520 2017-01-03  
厉害 动态可以扩展很多方法和思路啊

相关推荐

    17. Spring Boot普通类调用bean【从零开始学Spring Boot】

    在Spring Boot框架中,普通类调用bean是常见的操作,特别是在构建复杂应用时。... Spring Boot普通类调用bean【从零开始学Spring Boot】"可能涵盖了这些内容的实践示例和详细解释,建议读者详细阅读以加深理解。

    27. Spring Boot Junit单元测试【从零开始学Spring Boot】

    Spring Boot Junit单元测试【从零开始学Spring Boot】"的主题,深入探讨Spring Boot中Junit单元测试的使用方法和最佳实践。 首先,我们要了解什么是单元测试。单元测试是一种针对软件中的最小可测试单元(如方法)...

    41. Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】

    在本篇博文中,我们将深入探讨如何在Spring Boot应用中使用Java代码来创建Bean并将其注册到Spring容器中。这是Spring Boot的核心特性之一,它使得...总的来说,理解并熟练运用Java配置是掌握Spring Boot的关键步骤。

    16. Spring Boot使用Druid(编程注入)【从零开始学Spring Boot】

    在本篇【从零开始学Spring Boot】系列中,我们将探讨如何在Spring Boot项目中使用Druid数据源进行编程注入。Druid是一个优秀的数据库连接池,它提供了强大的监控和扩展功能,是许多企业级应用首选的数据源解决方案。...

    31. Spring Boot导入XML配置【从零开始学Spring Boot】

    在本篇【从零开始学Spring Boot】系列教程中,我们将深入探讨如何在Spring Boot项目中导入并使用XML配置。Spring Boot以其简化Spring应用的初始搭建以及开发过程而闻名,通常推崇的是Java配置而非XML配置。然而,在...

    从零开始学Spring Boot

    从零开始学Spring Boot,没有...16)Spring Boot使用Druid(编程注入)【从零开始学Spring Boot】 http://412887952-qq-com.iteye.com/blogs/2292376 (17)Spring Boot普通类调用bean【从零开始学Spring Boot】: ...

    38. Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】

    在Spring Boot应用中,随着系统复杂度的增加,单一服务器往往无法满足高并发、高可用的需求,因此我们会采用分布式架构。然而,在分布式环境下,传统的基于HTTP Session的状态管理方式会遇到问题,因为每个服务器都...

    47. Spring Boot发送邮件【从零开始学Spring Boot】

    在本篇博文中,我们将深入探讨如何使用Spring Boot发送电子邮件,这是Spring Boot框架的一个非常实用的功能,可以帮助开发者轻松实现企业级应用中的邮件服务。通过学习本文,你可以掌握Spring Boot集成...

    15. Spring Boot使用Druid和监控配置【从零开始学Spring Boot】

    在本篇【从零开始学Spring Boot】系列中,我们将探讨如何在Spring Boot项目中集成并配置Druid数据源以及其监控功能。Druid是一个强大的数据库连接池,它提供了丰富的监控、扩展性以及性能优化特性。Spring Boot简化...

    37. Spring Boot集成EHCache实现缓存机制【从零开始学Spring Boot】

    通过自动配置和起步依赖,Spring Boot使得开发者可以快速搭建项目并开始开发。 接下来,我们讨论**EHCache**。EHCache是一款开源的、内存中的数据缓存系统,广泛用于Java应用程序中。它可以缓存对象,减少数据库...

    39.1 Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot与Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发而闻名,而Shiro则是一个轻量级的安全框架,适用于身份验证、授权、会话管理和安全性相关的...

    39.2. Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot和Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发能力而闻名,而Shiro则是一个强大的安全管理框架,提供了认证、授权、会话管理和安全加密等...

    从零开始学spring boot

    《从零开始学Spring Boot》是一本面向初学者的指南,旨在帮助编程新手全面理解并掌握Spring Boot这一强大的Java开发框架。Spring Boot是Spring生态系统的一部分,它简化了配置,提供了快速构建应用程序的能力,使得...

    2. [视频]Spring Boot返回json数据【从零开始学Spring Boot】

    在本节【从零开始学Spring Boot】的视频教程中,我们将深入探讨如何在Spring Boot应用中处理JSON数据。Spring Boot作为一个快速开发框架,极大地简化了创建和部署Java web应用程序的过程,同时也为处理HTTP响应提供...

    26. 改变自动扫描的包【从零开始学Spring Boot】

    改变自动扫描的包【从零开始学Spring Boot】”涉及到的是Spring Boot框架中的组件扫描机制。在Spring Boot中,自动配置是其核心特性之一,它能够根据项目依赖来自动配置相应的Bean。默认情况下,Spring Boot会扫描...

    9. 使用JdbcTemplate【从零开始学Spring Boot】

    总结来说,本节主要介绍了如何在Spring Boot项目中使用JdbcTemplate进行数据库操作,包括设置依赖、配置数据源、注入JdbcTemplate以及执行SQL查询、更新、插入和删除操作。了解并掌握这些基本操作,将有助于我们在...

    从零开始Spring Boot

    从零开始Spring Boot,通过实战快速入门。Spring Boot不是一门新技术,所以不用紧张。从本质上来说,Spring Boot就是Spring,它做了那些没有它你也会去做的Spring Bean配置。它使用“习惯优于配置”(项目中存在大量...

    Springboot入门到精通(超详细文档)

    Spring Boot 是一个由 Pivotal Team 创建的 Java 框架,它旨在简化Spring应用程序的初始设置和开发过程。...通过不断的实践和学习,你将能够深入理解并熟练运用Spring Boot,实现从入门到精通的转变。

Global site tag (gtag.js) - Google Analytics