配置IOC的方式(配置文件和注解)

news2024/12/29 9:18:41

目录

  • 背景
  • 实现
    • xml方式
      • 实现结果:
    • 注解方式
      • 实现效果:
  • 升华

背景

我们已经学些了IOC概念和原理详情请见 一篇文章解释清楚IOC和DI
下面说如何实现IOC容器的效果。

实现

首先引入jar包

       <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.2.0.RELEASE</version>
            </dependency>

xml方式

在这里插入图片描述

public class SpringTest {
    public static void main(String[] args) {



        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = (Person) applicationContext.getBean("person");
        person.eat();



    }
}
package IOC2023年7月1日.xml方式;

public class Person {
    private String name;//名字
    private Fruit fruit;//水果

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Fruit getFruit() {
        return fruit;
    }

    public void setFruit(Fruit fruit) {
        this.fruit = fruit;
    }
    //吃水果方法
    public void eat(){
        System.out.println(name+"吃一个"+fruit.getColor()+"的"+fruit.getName()+"觉得很"+fruit.getTaste());
    }

}

package IOC2023年7月1日.xml方式;

public class Fruit {

    private String name;//水果名

    private String color;//颜色

    private String taste;//口味

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getTaste() {
        return taste;
    }

    public void setTaste(String taste) {
        this.taste = taste;
    }

    @Override
    public String toString() {
        return name+"的味道是"+taste+"颜色是"+color;
    }
}


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--使用bena标签创建对象:创建Fruit的对象在spring中的标记为fruit。我们可以通过fruit找到该对象并使用
        id属性:可以随便写。spring创建对象存储在spring中容器中的名字,注意不是对象名
        class属性:创建的对象的全路径
    -->
    <bean id="fruit" class="IOC2023年7月1日.xml方式.Fruit">
        <!--使用property标签赋值
        name属性:类中的属性名
        value属性:具体的数据
        -->
        <property name="name" value="banana"></property>
        <property name="color" value="yellow"></property>
        <property name="taste" value="sweet"></property>
    </bean>

    <!--创建另外一个Fruit对象-->
    <bean id="fruit2" class="IOC2023年7月1日.xml方式.Fruit">
        <property name="name" value="苹果"></property>
        <property name="color" value="绿"></property>
        <property name="taste" value="酸"></property>
    </bean>
    <!--创建Person对象-->
    <bean id="person" class="IOC2023年7月1日.xml方式.Person">
        <!--使用ref属性引用IOC容器中的对象进行赋值-->
        <property name="fruit" ref="fruit"></property>

        <property name="name" value="小明"></property>
    </bean>



</beans>

是 Spring 配置文件的根节点。
用来定义一个 JavaBean。id 属性是它的标识,在文件中必须唯一;class 属性是它关联的类。

实现结果:

在这里插入图片描述
使用配置文件:

配置文件通常以特定格式(如XML、JSON、YAML等)编写。
配置文件包含了应用程序的各种配置参数。
配置文件的修改可以改变应用程序的行为和属性。
配置文件的结构化格式易于组织和维护。
配置文件相对灵活,允许在不重新编译和部署应用程序的情况下进行调整。
使用注解:

注解是一种特殊的注释形式,提供了额外的元数据信息。
注解通过在代码中标记和配置应用程序的组件和属性。
注解以声明式的方式提供配置信息,使得配置更直观易懂。
注解通常在编译时或运行时通过注解处理器解析和处理。
注解可以在编译阶段或运行阶段进行验证、转换和处理。
注意事项:

配置文件适用于相对复杂或动态的配置信息,而注解更适合直观和紧密集成的配置管理。
配置文件的修改通常需要手动编辑,而注解可以直接在代码中配置。
注解的使用需要遵循特定的注解规范和语法,需要适应和学习。
过度使用注解可能导致代码的可读性和维护性下降,需要谨慎使用和设计注解。

注解方式

在这里插入图片描述

package IOC2023年7月1日.Annotation;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.annotation.Resource;

public class SpringTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("applicationContext1.xml");
       Person person = (Person) applicationContext.getBean("person");
        person.eat();


    }
}

package IOC2023年7月1日.Annotation;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component
public class Person {
    @Value("小明")
    private String name;//名字
    //使用Resource注解引用IOC容器中的对象给属性赋值
    @Resource(name = "fruit")
    private Fruit fruit;//水果

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Fruit getFruit() {
        return fruit;
    }

    public void setFruit(Fruit fruit) {
        this.fruit = fruit;
    }
    //吃水果方法
    public void eat(){
        System.out.println(name+"吃一个"+fruit.getColor()+"的"+fruit.getName()+"觉得很"+fruit.getTaste());
    }
}

package IOC2023年7月1日.Annotation;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * ClassName: Fruit
 * 使用@Component注解创建对象,相当于bean标签,value属性相当于id属性
 * 意思是创建Fruit类的对象存储在IOC容器中,在IOC中名字为fruit
 * 使用Value注解来为属性注入固定的值
 */
@Component(value = "fruit")
public class Fruit {
    @Value("芒果")
    private String name;//水果名
    @Value("黄色")
    private String color;//颜色
    @Value("芒果味")
    private String taste;//口味

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getTaste() {
        return taste;
    }

    public void setTaste(String taste) {
        this.taste = taste;
    }

    @Override
    public String toString() {
        return name+"的味道是"+taste+"颜色是"+color;
    }
}



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <!--开启包扫描,可以扫描到com.stt包下的所有注解-->
    <context:component-scan base-package="IOC2023年7月1日.Annotation"/>
</beans>

实现效果:

在这里插入图片描述

升华

注解方式的好处:

简洁明了:通过在代码中添加注解,可以直观地标识出哪些类需要进行依赖注入,使代码结构更加清晰和易于理解。
编译时检查:注解方式在编译时就可以进行类型检查和错误检查,可以及早发现依赖注入相关的问题,减少运行时错误。
便于维护:通过注解方式进行依赖注入,可以方便地修改和调整注入的依赖关系,而无需修改繁琐的配置文件。
注解方式的坏处:

紧耦合:使用注解进行依赖注入可能会导致代码和框架之间的紧耦合,使得代码依赖于特定的注解和框架。
难以配置复杂依赖:对于复杂的依赖关系,使用注解方式可能会变得复杂和难以配置,可能需要编写大量的注解和参数配置。
配置文件方式的好处:

灵活可配置:通过配置文件可以灵活地配置依赖关系,可以在运行时动态修改和调整依赖关系,无需重新编译代码。
解耦合:配置文件方式可以将依赖关系从代码中分离出来,降低了代码的耦合度,使得代码更加可维护和可扩展。
支持复杂依赖:配置文件方式可以支持更复杂的依赖关系,可以配置各种类型的依赖注入和依赖解析策略。
配置文件方式的坏处:

配置复杂:相比注解方式,配置文件方式可能需要编写更多的配置信息,配置文件的编写和维护可能会增加开发的工作量。
运行时错误:由于配置文件是在运行时加载和解析的,因此配置错误或格式错误可能会导致运行时错误,增加调试和排查问题的难度。
综上所述,注解方式和配置文件方式都有自己的适用场景和优劣势,具体选择哪种方式取决于项目的需求、团队的偏好和开发的复杂度。一般而言,注解方式适合简单的依赖注入场景,而配置文件方式适合复杂的依赖注入和需要灵活配置的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/727068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Prometheus - Concept

一 Prometheus 是什么 Prometheus 是一个开源的 监控和报警系统 。该系统内置和基于时间序列地抓取、存储、查询、绘图数据、报警。 现在是一个开源项目&#xff0c;继 K8S 后的第二个云原生计算基金会的托管项目&#xff0c;可见其火爆程度。 二 Prometheus 的特征 Promet…

异构系统的对接互通,天翎低代码平台有高招

编者按&#xff1a;企业内部里&#xff0c;最难的就是跨系统、跨应用的对接问题&#xff0c;系统之间的阻隔是影响业务效率的重要原因之一&#xff0c;如今随着技术的发展&#xff0c;这个问题上天翎低代码平台在异构系统对接方面提供多元化、多层次的方式让企业高效低成本的打…

python处理yaml、ini和execl文件

一、yaml的初步了解 YAML 是一个被广泛使用的数据序列化和配置语言&#xff0c;后缀可以为yaml或yml, 支持#注释&#xff0c;通过缩进表示层级&#xff0c;区分大小写&#xff0c;读取出来之后是一个字典列表 yaml 的用途&#xff1a; 用于做配置文件 &#xff08;yaml &…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第十八天 18/50【层序遍历二叉树(两个队列一个遍历上一层,一个记录下一层)】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

数字虚拟人物制作为多个行业中的智能应用场景赋能

虚拟人物制作的广义定义为数字化外形的虚拟人物&#xff0c;是“虚拟”(存在于非物理世界中)“数字”(由计算机图形学、图形染、动作捕捉、深度学习、语音合成等计算机手段创造及使用)“人”(具有多重人类特征&#xff0c;如外貌、人类表演/交互能力等)的综合产物。 制作一个虚…

Hbase drop 表卡住没有响应

在实际工作中遇到过重新创建一个hbase的hive外部表&#xff0c;在 disable table_name; drop table_name 在drop table_name卡住 最后有提示报错。 建议各位查看下表有无lock的情况&#xff0c; 查看和释放hbase lock可以通过如下方式来查看 pid获取&#xff1a; 在 Ma…

idea支持vue文件-设置对vue的支持

一、idea支持.vue文件 这一步其实就是安装vue.js插件&#xff0c;具体路径为&#xff1a;File ----> Settings ----> Plugins ----> 输入vue&#xff0c;点击搜索结果里的vue.js右边的install按钮&#xff0c;安装成功后重启idea&#xff0c;这样idea就能识别.vue文件…

惨痛面经,做个记录

今天的行情太难了&#xff0c;找工作的还是比较艰难的一个过程。不和哪些优秀的人对比&#xff0c;我就是普通二本院校&#xff0c;工作4年&#xff0c;能力一般般&#xff0c;努力奋斗的一个搬砖人。分享一个月比较惨痛的找工作经历。 简历这一块自己准备的时间比较长&#xf…

争夺数据黑匣子市场,谁将接盘这家Tier1的被动安全业务

在相继卖掉智驾软件算法资产&#xff08;高通收购&#xff09;、主动安全传感器及系统业务&#xff08;麦格纳收购&#xff09;后&#xff0c;Veoneer最后剩余的被动安全系统业务&#xff08;主要是安全气囊ECU&#xff09;也在寻找产业买家。 本周&#xff0c;美国私募股权公司…

Docker Swarm安装PXC高可用集群

docker安装PXC集群 创建数据卷创建集群专用网络创建证书 主流mysql高可用的方式有以下几种 准备三台服务器 hostIP说明node1192.168.31.130PXC集群1node2192.168.31.131PXC集群2node3192.168.31.132PXC集群3 创建docker swarm集群 主节点node1执行 #docker swarm init --ad…

Camera API2 使用说明

CameraAPI1 使用说明 目录 一、 概览 1.1 Pipeline 1.2 Supported Hardware Level 1.3 Capture 1.4 CameraManager 1.5 CameraCharacteristics 1.6 CameraDevice 1.7 Surface 1.8 CameraCaptureSession 1.9 CaptureRequest 1.10 CaptureResult 1.11 一些只有 Came…

基于 Arduino 库实现 ESP32 TCP Server 应用例程

实现步骤&#xff1a; ESP32 开启 WiFi Station 模式连接路由器连上路由器后将获取到分配的 IP 地址基于分配的 IP 地址创建 TCP Server 测试代码如下&#xff1a; #include <WiFi.h> #include <WiFiClient.h>const char* ssid "cc2.4"; const char*…

《水经注地图服务》发布的影像数据在ArcMap中调用

当有用户需要发布一个省以上的海量卫星影像数据时&#xff0c;我们就会强烈建议他使用《水经注地图服务》&#xff08;WeServer&#xff09;进行发布。 因为&#xff0c;《水经注地图服务》在经过我们工程师的不断升级优化之后&#xff0c;现在发布全球100TB级卫星影像数据所需…

【用户调研】需求挖掘

文章目录 用户需求的定义为什么要挖掘用户需求需求挖掘方法用户访谈问卷调查可用性测试运营数据分析 用户访谈介绍实地研究用户观察用户访谈焦点小组 调查问卷介绍总结 用户需求的定义 为什么要挖掘用户需求 需求挖掘方法 用户访谈 问卷调查 可用性测试 运营数据分析 用户访谈介…

妙记多 Mojidoc PC端(Mac+Windows 端)内测体验官招募!

你们呼唤了无数呼唤的妙记多 Mojidoc 客户端来了&#xff01; 优先内测上线的是 桌面端&#xff01;包含 Mac端 和 Windows 端 为了更好的用户体验&#xff0c;小 Mojidoc 在上线前邀请大家一起加入内测体验&#xff01; 为了让你更好的成为内测体验官&#xff0c;有一点心里…

使用adb工具通过wifi连接安卓设备

一、下载adb包&#xff0c;并解压。网上很多地方可以下载资源或者从我的网盘下载 链接&#xff1a;https://pan.baidu.com/s/1hLf14wCCUMs2xdU5WkLY8g 提取码&#xff1a;8cbh 二、安卓设备打开开发者选项&#xff0c;打开USB调试开关 三、确保手机和wifi在同一个wifi网路下。…

SSM学习笔记-------SpringMVC(二)

SSM学习笔记-------SpringMVC&#xff08;二&#xff09; SpringMVC_day021、SSM整合1.1 流程分析1.2 整合配置步骤1&#xff1a;创建Maven的web项目步骤2:添加依赖步骤3:创建项目包结构步骤4:创建SpringConfig配置类步骤5:创建JdbcConfig配置类步骤6:创建MybatisConfig配置类步…

QT中LIBS的配置

QT中引用外部第3方库时&#xff0c;需要配置LIBS参数。 QT选择kit时有MSVC、MinGW两种方式&#xff0c;一般MSVC的静态库文件以.lib结尾&#xff0c;MinGW以.a结尾。什么是C的静态库、动态库我这里就不介绍了&#xff0c;其实这种库在几乎所有的语言中都有&#xff1a;比如jav…

用android studio 测试发行包

在google play 发行app&#xff0c;需要用bundle&#xff0c;而不是apk。 bundle 比apk 要小很多&#xff0c;比如我的app-release.aab 29,736 KB&#xff0c; 而app-release.apk 是62,305KB。这就是少了一半多。但是apk 直接复制就可以安装&#xff0c;bundle 需要上传google…

研究讯飞星火模型的时候,使用websocket的一个总结

接受数据 <?php header("Content-Type:text/html;charsetutf-8");//确保在连接客户端时不会超时set_time_limit(0);//设置IP和端口号$address "wss://tts-api.xfyun.cn/v2/tts?authorizationYXBpX2tleT0iNDE4ZjJjOTI2NTY0YTc1ZDNjMmE5NDliMTE0MzRkZTYiLCB…