SpringBoot替换容器内注入的Bean

29 篇文章 0 订阅
23 篇文章 0 订阅

在开发的过程中,经常引入别人写的jar包实现某功能。而别的jar包一般都自动注入Spring容器中,假设都是通过@Bean、@Service或@Component注入的,并且没有加入@ConditionalXXX等注解,导致无法替换掉别人的实现,假设这时就想替换掉,那该如何实现呢?

  1. BeanDefinitionRegistry 是一个接口,它定义了关于 BeanDefinition 的注册、移除、查询等一系列的操作。
  2. BeanDefinitionRegistryPostProcessor接口常用于给接口动态添加代理类。
  • BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor 都是spring的后置处理器,但是两个类的侧重点不一样,
  • BeanDefinitionRegistryPostProcessor 侧重于创建自定义的bd 而 BeanFactoryPostProcessor侧重于对已有bd属性的修改。
  • BeanDefinitionRegistryPostProcessor 先于 BeanFactoryPostProcessor 执行

参考

替换Spring容器中已经存在的Bean
Spring(五)核心容器 - 注册 Bean、BeanDefinitionRegistry 简介
Spring之27:BeanDefinitionRegistry
BeanDefinitionRegistryPostProcessor作用及加载顺序
BeanDefinitionRegistryPostProcessor的作用及和 BeanFactoryPostProcessor 的区别
BeanDefinitionRegistryPostProcessor——动态注册Bean到Spring容器

代码

pom

<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-boot.version>2.3.1.RELEASE</spring-boot.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-core</artifactId>
        <version>5.3.8</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

验证代码-java

接口

/**
 * 替换Spring容器中已经存在的Bean-接口
 *
 * @author z.y.l
 * @version v1.0
 * @date 2022/10/8
 */
public interface DemoMasterService {
    /**
     * 主函数
     */
    void init();
}

源实现类

import xx.xxx.spring.boot.branch.service.DemoMasterService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

/**
 * 替换Spring容器中已经存在的Bean-主
 *
 * @author z.y.l
 * @version v1.0
 * @date 2022/10/8
 */
@Service("demoMasterService")
public class DemoMasterServiceImpl implements DemoMasterService {
    private final Logger logger = LoggerFactory.getLogger(DemoMasterServiceImpl.class);
    @Override
    public void init() {
        logger.info("替换Spring容器中已经存在的Bean-主");
    }
    @PostConstruct
    private void post(){
        logger.info("类初始化-主》》》》》");
    }
}

替代类

import xx.xxx.spring.boot.branch.service.DemoMasterService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.PostConstruct;

/**
 * 替换Spring容器中已经存在的Bean-替代类,不使用 @Service
 *
 * @author z.y.l
 * @version v1.0
 * @date 2022/10/8
 */
public class DemoReplaceServiceImpl implements DemoMasterService {
    private final Logger logger = LoggerFactory.getLogger(DemoReplaceServiceImpl.class);
    @Override
    public void init() {
        logger.info("替换Spring容器中已经存在的Bean-替代");
    }
    @PostConstruct
    private void post(){
        logger.info("类初始化-替代》》》》》");
    }
}

实现 spring 的类 BeanDefinitionRegistryPostProcessor,进行容器内类的偷天换日。

import xx.xxx.spring.boot.branch.service.impl.DemoReplaceServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.stereotype.Component;

/**
 * 替换 管理类
 *
 * @author z.y.l
 * @version v1.0
 * @date 2022/10/8
 */
@Component
public class OverrideExistsBeanDefRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    private final Logger logger = LoggerFactory.getLogger(OverrideExistsBeanDefRegistryPostProcessor.class);
    private final static String NAME = "demoMasterService";
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        String[] names = registry.getBeanDefinitionNames();
        logger.info("替换 管理类>>>>>,总注册类:{}",names.length);
        if(registry.containsBeanDefinition(NAME)){
            String beanName = registry.getBeanDefinition(NAME).getBeanClassName();
            logger.info("替换 管理类,替换目标类-移除源实现类,{}",beanName);
            registry.removeBeanDefinition(NAME);
            GenericBeanDefinition definition = new GenericBeanDefinition();
            logger.info("替换 管理类,替换目标类-注入替代实现类");
            definition.setBeanClass(DemoReplaceServiceImpl.class);
            registry.registerBeanDefinition(NAME,definition);
            beanName = registry.getBeanDefinition(NAME).getBeanClassName();
            logger.info("替换 管理类,替换目标类-最终实现类,{}",beanName);
        }
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    }
}

测试

在这里插入图片描述

c.z.s.b.b.c.OverrideExistsBeanDefRegistryPostProcessor [OverrideExistsBeanDefRegistryPostProcessor.java:31] =.= 替换 管理类>>>>>,总注册类:131
c.z.s.b.b.c.OverrideExistsBeanDefRegistryPostProcessor [OverrideExistsBeanDefRegistryPostProcessor.java:34] =.= 替换 管理类,替换目标类-移除源实现类,cn.zyl.spring.boot.branch.service.impl.DemoMasterServiceImpl
c.z.s.b.b.c.OverrideExistsBeanDefRegistryPostProcessor [OverrideExistsBeanDefRegistryPostProcessor.java:37] =.= 替换 管理类,替换目标类-注入替代实现类
c.z.s.b.b.c.OverrideExistsBeanDefRegistryPostProcessor [OverrideExistsBeanDefRegistryPostProcessor.java:41] =.= 替换 管理类,替换目标类-最终实现类,cn.zyl.spring.boot.branch.service.impl.DemoReplaceServiceImpl
o.s.b.w.e.t.TomcatWebServer [TomcatWebServer.java:108] =.= Tomcat initialized with port(s): 8080 (http)
...
c.z.s.b.b.s.i.DemoReplaceServiceImpl [DemoReplaceServiceImpl.java:24] =.= 类初始化-替代》》》》》

END

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 介紹 2. I. Spring Boot文档 i. 1. 关于本文档 ii. 2. 获取帮助 iii. 3. 第一步 iv. 4. 使用Spring Boot v. 5. 了解Spring Boot特性 vi. 6. 迁移到生存环境 vii. 7. 高级主题 3. II. 开始 i. 8. Spring Boot介绍 ii. 9. 系统要求 i. 9.1. Servlet容器 iii. 10. Spring Boot安装 i. 10.1. 为Java开发者准备的安装指南 i. 10.1.1. Maven安装 ii. 10.1.2. Gradle安装 ii. 10.2. Spring Boot CLI安装 i. 10.2.1. 手动安装 ii. 10.2.2. 使用GVM安装 iii. 10.2.3. 使用OSX Homebrew进行安装 iv. 10.2.4. 使用MacPorts进行安装 v. 10.2.5. 命令行实现 vi. 10.2.6. Spring CLI示例快速入门 iii. 10.3. 从Spring Boot早期版本升级 iv. 11. 开发你的第一个Spring Boot应用 v. 11.1. 创建POM vi. 11.2. 添加classpath依赖 vii. 11.3. 编写代码 i. 11.3.1. @RestController和@RequestMapping注解 ii. 11.3.2. @EnableAutoConfiguration注解 iii. 11.3.3. main方法 viii. 11.4. 运行示例 ix. 11.5. 创建一个可执行jar x. 12. 接下来阅读什么 4. III. 使用Spring Boot i. 13. 构建系统 i. 13.1. Maven i. 13.1.1. 继承starter parent ii. 13.1.2. 使用没有父POM的Spring Boot iii. 13.1.3. 改变Java版本 iv. 13.1.4. 使用Spring Boot Maven插件 ii. 13.2. Gradle iii. 13.3. Ant iv. 13.4. Starter POMs ii. 14. 组织你的代码 i. 14.1. 使用"default"包 ii. 14.2. 定位main应用类 iii. 15. 配置类 目錄 Spring Boot参考指南 2 i. 15.1. 导入其他配置类 ii. 15.2. 导入XML配置 iv. 16. 自动配置 i. 16.1. 逐步替换自动配置 ii. 16.2. 禁用特定的自动配置 v. 17. Spring Beans和依赖注入 vi. 18. 使用@SpringBootApplication注解 vii. 19. 运行应用程序 i. 19.1. 从IDE中运行 ii. 19.2. 作为一个打包后的应用运行 iii. 19.3. 使用Maven插件运行 iv. 19.4. 使用Gradle插件运行 v. 19.5. 热交换 viii. 20. 打包用于生产的应用程序 ix. 21. 接下来阅读什么 5. IV. Spring Boot特性 i. 22. SpringApplication i. 22.1. 自定义Banner ii. 22.2. 自定义SpringApplication iii. 22.3. 流畅的构建API iv. 22.4. Application事件和监听器 v. 22.5. Web环境 vi. 22.6. 命令行启动器 vii. 22.7. Application退出 ii. 23.外化配置 i. 23.1. 配置随机值 ii. 23.2. 访问命令行属性 iii. 23.3. Application属性文件 iv. 23.4. 特定的Profile属性 v. 23.5. 属性占位符 vi. 23.6. 使用YAML代替Properties i. 23.6.1. 加载YAML ii. 23.6.2. 在Spring环境中使用YAML暴露属性 iii. 23.6.3. Multi-profile YAML文档 iv. 23.6.4. YAML缺点 vii. 23.7. 类型安全的配置属性 i. 23.7.1. 第三方配置 ii. 23.7.2. 松散的绑定(Relaxed binding) iii. 23.7.3. @ConfigurationProperties校验 iii. 24. Profiles i. 24.1. 添加激活的配置(profiles) ii. 24.2.以编程方式设置profiles iii. 24.3. Profile特定配置文件 iv. 25. 日志 i. 25.1. 日志格式 ii. 25.2. 控制台输出 iii. 25.3. 文件输出 iv. 25.4. 日志级别 v. 25.5. 自定义日志配置 v. 26. 开发Web应用 i. 26.1. Spring Web MVC框架 i. 26.1.1. Spring MVC自动配置 ii. 26.1.2. HttpMessageConverters Spring Boot参考指南 3 iii. 26.1.3. MessageCodesResolver iv. 26.1.4. 静态内容 v. 26.1.5. 模板引擎 vi. 26.1.6. 错误处理 vii. 26.1.7. Spring HATEOAS ii. 26.2. JAX-RS和Jersey iii. 26.3. 内嵌servlet容器支持 i. 26.3.1. Servlets和Filters ii. 26.3.2. EmbeddedWebApplicationContext iii. 26.3.3. 自定义内嵌servlet容器 iv. 26.3.4. JSP的限制 vi. 27. 安全 vii. 28. 使用SQL数据库 i. 28.1. 配置DataSource i. 28.1.1. 对内嵌数据库的支持 ii. 28.1.2. 连接到一个生产环境数据库 iii. 28.1.3. 连接到一个JNDI数据库 ii. 28.2. 使用JdbcTemplate iii. 28.3. JPA和Spring Data i. 28.3.1. 实体类 ii. 28.3.2. Spring Data JPA仓库 iii. 28.3.3. 创建和删除JPA数据库 viii. 29. 使用NoSQL技术 i. 29.1. Redis i. 29.1.1. 连接Redis ii. 29.2. MongoDB i. 29.2.1. 连接MongoDB数据库 ii. 29.2.2. MongoDBTemplate iii. 29.2.3. Spring Data MongoDB仓库 iii. 29.3. Gemfire iv. 29.4. Solr i. 29.4.1. 连接Solr ii. 29.4.2. Spring Data Solr仓库 v. 29.5. Elasticsearch i. 29.5.1. 连接Elasticsearch ii. 29.5.2. Spring Data Elasticseach仓库 ix. 30. 消息 i. 30.1. JMS i. 30.1.1. HornetQ支持 ii. 30.1.2. ActiveQ支持 iii. 30.1.3. 使用JNDI ConnectionFactory iv. 30.1.4. 发送消息 v. 30.1.5. 接收消息 x. 31. 发送邮件 xi. 32. 使用JTA处理分布式事务 i. 32.1. 使用一个Atomikos事务管理器 ii. 32.2. 使用一个Bitronix事务管理器 iii. 32.3. 使用一个J2EE管理的事务管理器 iv. 32.4. 混合XA和non-XA的JMS连接 v. 32.5. 支持可替代的内嵌事务管理器 xii. 33. Spring集成 xiii. 34. 基于JMX的监控和管理 xiv. 35. 测试 Spring Boot参考指南 4 i. 35.1. 测试作用域依赖 ii. 35.2. 测试Spring应用 iii. 35.3. 测试Spring Boot应用 i. 35.3.1. 使用Spock测试Spring Boot应用 iv. 35.4. 测试工具 i. 35.4.1. ConfigFileApplicationContextInitializer ii. 35.4.2. EnvironmentTestUtils iii. 35.4.3. OutputCapture iv. 35.4.4. TestRestTemplate xv. 36. 开发自动配置和使用条件 i. 36.1. 理解auto-configured beans ii. 36.2. 定位auto-configuration候选者 iii. 36.3. Condition注解 i. 36.3.1. Class条件 ii. 36.3.2. Bean条件 iii. 36.3.3. Property条件 iv. 36.3.4. Resource条件 v. 36.3.5. Web Application条件 vi. 36.3.6. SpEL表达式条件 xvi. 37. WebSockets xvii. 38. 接下来阅读什么 6. V. Spring Boot执行器: Production-ready特性 i. 39. 开启production-ready特性 ii. 40. 端点 i. 40.1. 自定义端点 ii. 40.2. 健康信息 iii. 40.3. 安全与HealthIndicators i. 40.3.1. 自动配置的HealthIndicators ii. 40.3.2. 编写自定义HealthIndicators iv. 40.4. 自定义应用info信息 i. 40.4.1. 在构建时期自动扩展info属性 ii. 40.4.2. Git提交信息 iii. 41. 基于HTTP的监控和管理 i. 41.1. 保护敏感端点 ii. 41.2. 自定义管理服务器的上下文路径 iii. 41.3. 自定义管理服务器的端口 iv. 41.4. 自定义管理服务器的地址 v. 41.5. 禁用HTTP端点 vi. 41.6. HTTP Health端点访问限制 iv. 42. 基于JMX的监控和管理 i. 42.1. 自定义MBean名称 ii. 42.2. 禁用JMX端点 iii. 42.3. 使用Jolokia通过HTTP实现JMX远程管理 i. 42.3.1. 自定义Jolokia ii. 42.3.2. 禁用Jolokia iv. 43. 使用远程shell来进行监控和管理 i. 43.1. 连接远程shell i. 43.1.1. 远程shell证书 ii. 43.2. 扩展远程shell i. 43.2.1. 远程shell命令 ii. 43.2.2. 远程shell插件 v. 44. 度量指标(Metrics) i. 44.1. 系统指标 Spring Boot参考指南 5 ii. 44.2. 数据源指标 iii. 44.3. Tomcat session指标 iv. 44.4. 记录自己的指标 v. 44.5. 添加你自己的公共指标 vi. 44.6. 指标仓库 vii. 44.7. Dropwizard指标 viii. 44.8. 消息渠道集成 vi. 45. 审计 vii. 46. 追踪(Tracing) i. 46.1. 自定义追踪 viii. 47. 进程监控 i. 47.1. 扩展属性 ii. 47.2. 以编程方式 ix. 48. 接下来阅读什么 7. VI. 部署到云端 i. 49. Cloud Foundry i. 49.1. 绑定服务 ii. 50. Heroku iii. 51. Openshift iv. 52. Google App Engine v. 53. 接下来阅读什么 8. VII. Spring Boot CLI i. 54. 安装CLI ii. 55. 使用CLI i. 55.1. 使用CLI运行应用 i. 55.1.1. 推断"grab"依赖 ii. 55.1.2. 推断"grab"坐标 iii. 55.1.3. 默认import语句 iv. 55.1.4. 自动创建main方法 v. 55.1.5. 自定义"grab"元数据 ii. 55.2. 测试你的代码 iii. 55.3. 多源文件应用 iv. 55.4. 应用打包 v. 55.5. 初始化新工程 vi. 55.6. 使用内嵌shell vii. 55.7. 为CLI添加扩展 iii. 56. 使用Groovy beans DSL开发应用 iv. 57. 接下来阅读什么 9. VIII. 构建工具插件 i. 58. Spring Boot Maven插件 i. 58.1. 包含该插件 ii. 58.2. 打包可执行jar和war文件 ii. 59. Spring Boot Gradle插件 i. 59.1. 包含该插件 ii. 59.2. 声明不带版本的依赖 i. 59.2.1. 自定义版本管理 iii. 59.3. 默认排除规则 iv. 59.4. 打包可执行jar和war文件 v. 59.5. 就地(in-place)运行项目 vi. 59.6. Spring Boot插件配置 vii. 59.7. Repackage配置 viii. 59.8. 使用Gradle自定义配置进行Repackage i. 59.8.1. 配置选项 Spring Boot参考指南 6 ix. 59.9. 理解Gradle插件是如何工作的 iii. 60. 对其他构建系统的支持 i. 60.1. 重新打包存档 ii. 60.2. 内嵌的库 iii. 60.3. 查找main类 iv. 60.4. repackage实现示例 iv. 61. 接下来阅读什么 10. IX. How-to指南 i. 62. Spring Boot应用 i. 62.1. 解决自动配置问题 ii. 62.2. 启动前自定义Environment或ApplicationContext iii. 62.3. 构建ApplicationContext层次结构(添加父或根上下文 iv. 62.4. 创建一个非web(non-web)应用 ii. 63. 属性&配置 i. 63.1. 外部化SpringApplication配置 ii. 63.2. 改变应用程序外部配置文件的位置 iii. 63.3. 使用'short'命令行参数 iv. 63.4. 使用YAML配置外部属性 v. 63.5. 设置生效的Spring profiles vi. 63.6. 根据环境改变配置 vii. 63.7. 发现外部属性的内置选项 iii. 64. 内嵌的servlet容器 i. 64.1. 为应用添加Servlet,Filter或ServletContextListener ii. 64.2. 改变HTTP端口 iii. 64.3. 使用随机未分配的HTTP端口 iv. 64.4. 发现运行时的HTTP端口 v. 64.5. 配置SSL vi. 64.6. 配置Tomcat vii. 64.7. 启用Tomcat的多连接器(Multiple Connectors) viii. 64.8. 在前端代理服务器后使用Tomcat ix. 64.9. 使用Jetty替代Tomcat x. 64.10. 配置Jetty xi. 64.11. 使用Undertow替代Tomcat xii. 64.12. 配置Undertow xiii. 64.13. 启用Undertow的多监听器 xiv. 64.14. 使用Tomcat7 i. 64.14.1. 通过Maven使用Tomcat7 ii. 64.14.2. 通过Gradle使用Tomcat7 xv. 64.15. 使用Jetty8 i. 64.15.1. 通过Maven使用Jetty8 ii. 64.15.2. 通过Gradle使用Jetty8 xvi. 64.16. 使用@ServerEndpoint创建WebSocket端点 xvii. 64.17. 启用HTTP响应压缩 i. 64.17.1. 启用Tomcat的HTTP响应压缩 ii. 64.17.2. 使用GzipFilter开启HTTP响应压缩 iv. 65. Spring MVC i. 65.1. 编写一个JSON REST服务 ii. 65.2. 编写一个XML REST服务 iii. 65.3. 自定义Jackson ObjectMapper iv. 65.4. 自定义@ResponseBody渲染 v. 65.5. 处理Multipart文件上传 vi. 65.6. 关闭Spring MVC DispatcherServlet vii. 65.7. 关闭默认的MVC配置 Spring Boot参考指南 7 viii. 65.8. 自定义ViewResolvers v. 66. 日志 i. 66.1. 配置Logback ii. 66.2. 配置Log4j i. 66.2.1. 使用YAML或JSON配置Log4j2 vi. 67. 数据访问 i. 67.1. 配置一个数据源 ii. 67.2. 配置两个数据源 iii. 67.3. 使用Spring Data仓库 iv. 67.4. 从Spring配置分离@Entity定义 v. 67.5. 配置JPA属性 vi. 67.6. 使用自定义的EntityManagerFactory vii. 67.7. 使用两个EntityManagers viii. 67.8. 使用普通的persistence.xml ix. 67.9. 使用Spring Data JPA和Mongo仓库 x. 67.10. 将Spring Data仓库暴露为REST端点 vii. 68. 数据库初始化 i. 68.1. 使用JPA初始化数据库 ii. 68.2. 使用Hibernate初始化数据库 iii. 68.3. 使用Spring JDBC初始化数据库 iv. 68.4. 初始化Spring Batch数据库 v. 68.5. 使用一个高级别的数据迁移工具 i. 68.5.1. 启动时执行Flyway数据库迁移 ii. 68.5.2. 启动时执行Liquibase数据库迁移 viii. 69. 批处理应用 i. 69.1. 在启动时执行Spring Batch作业 ix. 70. 执行器(Actuator) i. 70.1. 改变HTTP端口或执行器端点的地址 ii. 70.2. 自定义'白标'(whitelabel,可以了解下相关理念)错误页面 x. 71. 安全 i. 71.1. 关闭Spring Boot安全配置 ii. 71.2. 改变AuthenticationManager并添加用户账号 iii. 71.3. 当前端使用代理服务器时,启用HTTPS xi. 72. 热交换 i. 72.1. 重新加载静态内容 ii. 72.2. 在不重启容器的情况下重新加载Thymeleaf模板 iii. 72.3. 在不重启容器的情况下重新加载FreeMarker模板 iv. 72.4. 在不重启容器的情况下重新加载Groovy模板 v. 72.5. 在不重启容器的情况下重新加载Velocity模板 vi. 72.6. 在不重启容器的情况下重新加载Java类 i. 72.6.1. 使用Maven配置Spring Loaded ii. 72.6.2. 使用Gradle和IntelliJ配置Spring Loaded xii. 73. 构建 i. 73.1. 使用Maven自定义依赖版本 ii. 73.2. 使用Maven创建可执行JAR iii. 73.3. 创建其他的可执行JAR iv. 73.4. 在可执行jar运行时提取特定的版本 v. 73.5. 使用排除创建不可执行的JAR vi. 73.6. 远程调试一个使用Maven启动的Spring Boot项目 vii. 73.7. 远程调试一个使用Gradle启动的Spring Boot项目 viii. 73.8. 使用Ant构建可执行存档(archive) ix. 73.9. 如何使用Java6 i. 73.9.1. 内嵌Servlet容器兼容性 Spring Boot参考指南 8 ii. 73.9.2. JTA API兼容性 xiii. 74. 传统部署 i. 74.1. 创建一个可部署的war文件 ii. 74.2. 为老的servlet容器创建一个可部署的war文件 iii. 74.3. 将现有的应用转换为Spring Boot iv. 74.4. 部署WAR到Weblogic v. 74.5. 部署WAR到老的(Servlet2.5)容器 11. X.附录 i. 附录A. 常见应用属性 ii. 附录B. 配置元数据 i. 附录B.1. 元数据格式 i. 附录B.1.1. Group属性 ii. 附录B.1.2. Property属性 iii. 附录B.1.3. 可重复的元数据节点 ii. 附录B.2. 使用注解处理器产生自己的元数据 i. 附录 B.2.1. 内嵌属性 ii. 附录 B.2.2. 添加其他的元数据 iii. 附录C. 自动配置类 i. 附录 C.1. 来自spring-boot-autoconfigure模块 ii. 附录C.2. 来自spring-boot-actuator模块 iv. 附录D. 可执行jar格式 i. 附录D.1. 内嵌JARs i. 附录D.1.1. 可执行jar文件结构 ii. 附录D.1.2. 可执行war文件结构 ii. 附录D.2. Spring Boot的"JarFile"类 i. 附录D.2.1. 对标准Java "JarFile"的兼容性 iii. 附录D.3. 启动可执行jars i. 附录D.3.1 Launcher manifest ii. 附录D.3.2. 暴露的存档 iv. 附录D.4. PropertiesLauncher特性 v. 附录D.5. 可执行jar的限制 i. 附录D.5.1. Zip实体压缩 ii. 附录D.5.2. 系统ClassLoader vi. 附录D.6. 可替代的单一jar解决方案
在使用SpringBoot的过程中,获取容器中的bean可以使用@Autowired注解或者通过ApplicationContext获取。其中,@Autowired注解可以自动注入容器中的bean实例,而ApplicationContext则提供了多种方式来获取bean。 使用@Autowired注解获取bean,只需要在需要使用bean的属性或者构造函数上标注该注解,并且确保该bean在程序启动时已经注入容器中。例如: ```java @Service public class MyService { //... } @RestController public class MyController { @Autowired private MyService myService; //... } ``` 在上面的例子中,MyController类中的myService属性使用@Autowired注解进行了注入SpringBoot会自动从容器中查找类型为MyService的bean,并将其注入到属性中。 除了@Autowired注解,还可以使用ApplicationContext来获取bean实例。具体来说,可以通过@ComponentScan注解将指定包下的类扫描并注册到Spring容器中,然后使用ApplicationContext来获取这些bean。例如: ```java @SpringBootApplication @ComponentScan(basePackages = "com.example") public class MyApplication { //... } @Service public class MyService { //... } public class MyUtils { public static MyService getService() { ApplicationContext context = new AnnotationConfigApplicationContext(MyApplication.class); return context.getBean(MyService.class); } } ``` 在上面的例子中,MyApplication使用@ComponentScan注解来指定需要注册到容器中的类所在的包,然后在MyUtils中使用ApplicationContext来获取容器中的MyService实例。需要注意的是,在每次获取bean实例时都会创建一个新的ApplicationContext,因此可能会有性能上的影响。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值