0

0

Spring框架中的控制反转

DDD

DDD

发布时间:2024-09-16 08:03:01

|

504人浏览过

|

来源于dev.to

转载

spring框架中的控制反转

控制反转(ioc)和依赖注入(di)是spring框架中的两个基本概念。传统上,对象负责创建和管理它们自己的依赖关系。然而,ioc 通过将对象创建和依赖管理的控制权移交给像 spring 这样的框架来翻转这一责任。

这种转变有几个优点:

  • 更容易的实现交换:只需对代码库进行最小的更改即可交换不同的实现。
  • 增加模块化:应用程序组件变得更加模块化,促进关注点分离。
  • 增强的可测试性:组件可以单独测试,这简化了模拟和其他测试策略。

ioc 可以通过各种机制来实现,包括工厂模式、策略模式或服务定位器模式等设计模式。然而,实现 ioc 最常见、最强大的方法是通过依赖注入。

了解依赖注入

依赖注入(di)是一种框架将依赖项注入对象而不是对象本身创建依赖项的技术。 spring中有不同类型的di:

  • 构造函数注入:通过类的构造函数提供依赖关系。
  • setter 注入:通过 setter 方法注入依赖项。
  • 字段注入:使用注释直接将依赖项分配给字段。

例如,在一个简单的服务类中,您可能会看到如下内容:

@service
public class orderservice {

    private final paymentservice paymentservice;

    @autowired
    public orderservice(paymentservice paymentservice) {
        this.paymentservice = paymentservice;
    }

    public void processorder(order order) {
        paymentservice.processpayment(order.getpaymentdetails());
    }
}

这里,paymentservice 通过构造函数注入注入到 orderservice 中,这种方式通常因其依赖关系清晰且易于测试而受到青睐。

ioc 容器:beanfactory 与 applicationcontext

spring提供了一个ioc容器,负责管理bean(spring管理的对象)的生命周期。这个容器的基本接口是beanfactory。然而,大多数应用程序使用 applicationcontext,它扩展了 beanfactory 并提供了附加功能。

bean工厂

  • 基本 ioc 容器:它提供创建和管理 bean 的基本功能。
  • 延迟初始化:bean 在首次请求时创建。

应用上下文

  • 高级ioc容器:除了beanfactory的基本功能外,它还提供:
    • 国际化 (i18n) 支持
    • 事件传播和处理
    • 异步请求处理
    • 与面向方面编程(aop)集成
  • 急切初始化:bean 可以在应用程序启动时实例化,使其可供立即使用。

例子:

// getting a bean from the applicationcontext
applicationcontext context = new classpathxmlapplicationcontext("applicationcontext.xml");
mybean mybean = context.getbean(mybean.class);

在此示例中,applicationcontext 用于检索 bean。如果您使用基本的 beanfactory,它将提供类似的功能,但没有 applicationcontext 的额外好处。

访问应用程序上下文

访问当前applicationcontext有两种常用的方式:

  1. autowired:将 applicationcontext 直接注入到您的组件中。

    @autowired
    private applicationcontext applicationcontext;
    
  2. applicationcontextaware:实现applicationcontextaware接口,它允许您根据需要检索applicationcontext。

    public class mybean implements applicationcontextaware {
        private applicationcontext applicationcontext;
    
        @override
        public void setapplicationcontext(applicationcontext context) throws beansexception {
            this.applicationcontext = context;
        }
    }
    

spring应用程序的生命周期

当 spring 应用程序启动时,会发生一系列步骤:

  1. 处理环境变量和属性:创建环境对象,合并 application.properties 或 application.yml 中的设置。

  2. 创建applicationcontext:确定并实例化适当的applicationcontext类型。例如,spring boot 应用程序可以使用 annotationconfigservletwebserverapplicationcontext 进行基于 java 的配置。

  3. 加载 bean 定义:spring 从多个源加载 bean 定义,例如带注释的类、@configuration 类或 xml 文件。每个 bean 定义都包含有关 bean 的类型、范围、依赖项和生命周期回调的信息。

    crmeb电商系统
    crmeb电商系统

    CRMEB 是基于Thinkphp5基础开发的以会员为中心的电商系统,开源版微信公众号商城和小程序商城数据同步,带积分、优惠券、秒杀、砍价、分销等功能,更是一套方便二次开发的商城框架(后台封装了独有快速创建表单功能,无需写表单页面、快速创建数据搜索和数据列表页、导出表格、系统权限配置控制每一个控制器方法、系统参数配置、数据字典、组合数据等)

    下载
  4. 处理 beanfactorypostprocessors:这些处理器在创建实际 bean 之前修改 bean 定义。

  5. 依赖关系解析和 bean 创建:applicationcontext 解析依赖关系并创建 bean。如果一个 bean 依赖于其他 bean,则首先创建这些依赖关系。

spring 中的 bean 作用域

spring 支持各种 bean 作用域,它们定义容器内 bean 的生命周期和可见性:

  • singleton(默认):为整个应用程序上下文创建 bean 的单个实例。
  • 原型:每次请求bean时都会创建一个新实例。
  • request:为每个 http 请求(web 应用程序)创建一个新的 bean 实例。
  • session:为每个 http 会话(web 应用程序)创建一个新的 bean 实例。

例子:

@bean
@scope("prototype")
public myprototypebean myprototypebean() {
    return new myprototypebean();
}

在此示例中,每次从容器请求时都会创建一个新的 myprototypebean 实例。

bean 作用域中的代理对象

考虑一个单例范围的 bean 依赖于原型范围的 bean 的场景。通常,原型 bean 仅在单例初始化期间创建一次。为了确保每次都提供原型 bean 的新实例,spring 使用代理对象。

代理示例:

@component
@scope(value = "singleton")
public class singletonbean {

    @autowired
    @scope(value = "prototype", proxymode = scopedproxymode.target_class)
    private prototypebean prototypebean;

    public void showmessage() {
        system.out.println(prototypebean.getmessage());
    }
}

这里,scopedproxymode.target_class 确保每次调用 getmessage() 时都会返回一个新的 prototypebean 实例。

spring框架和spring boot之间的区别

spring boot 是 spring 框架的扩展,可简化新 spring 应用程序的设置和开发。它提供:

  • 嵌入式应用程序服务器:使用嵌入式 tomcat、jetty 或 undertow 轻松将 spring 应用程序作为独立应用程序运行。
  • 自动配置:根据类路径和其他设置自动配置bean。
  • 简化打包:将应用程序打包为可执行 jar 或 war。
  • 集成监控和运行状况检查:用于监控应用程序运行状况和状态的内置端点。

spring boot 中的自动配置

自动配置是 spring boot 中的一项强大功能,它可以根据类路径中的依赖项为您配置许多内容。这是由条件注释控制的,例如:

  • @conditionalonclass
  • @conditionalonmissingclass
  • @conditionalonbean
  • @conditionalonmissingbean

例子:

例如,如果你的类路径中有 jackson,spring boot 将自动配置一个用于 json 序列化的 objectmapper:

@configuration
@conditionalonclass(objectmapper.class)
public class jacksonautoconfiguration {
    // configuration details...
}

如果存在 objectmapper,则会自动应用此配置。否则,将被跳过。

查看活动的自动配置

您可以通过将以下内容添加到 application.properties 来在启动期间记录活动的自动配置:

logging.level.org.springframework.boot.autoconfigure=DEBUG

这将生成一份详细的报告,显示哪些配置已应用,哪些未应用,帮助您排除故障或了解应用程序的配置。

结论

控制反转和依赖注入是核心概念,它们实现了灵活性、模块化和可测试性,使 spring 变得如此强大。通过了解 spring 的 ioc 容器如何工作、如何管理 bean 以及 spring boot 如何扩展这些功能,您可以更高效地开发健壮、可维护的应用程序。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

114

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

169

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

98

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

164

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

151

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

234

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

162

2024.02.23

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Tomcat核心原理解析
Tomcat核心原理解析

共57课时 | 7万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号