spring复习01,IOC的思想和第一个spring程序helloWorld

news2025/7/10 15:38:50

spring复习01,IOC的思想及本质

  • IOC的思想
  • 一个小例子,来体会IOC的基础思想。
    • dao层
      • dao层接口
      • dao层实现类
    • service层
      • service层接口
      • service层实现类
    • 测试代码
      • service层实现类修改
      • 测试代码修改
  • IOC容器在spring中的简单实现
    • 创建项目
    • 在pom.xml中引入依赖
    • 实体类创建
    • 创建spring的配置文件并且配置bean
    • 创建测试用例,测试输出

IOC的思想

IOC:Inversion of Control,翻译过来是反转控制。
翻转资源获取方向。把自己创建资源、向环境索取资源变成环境将资源准备好,我们享受资源注入。

  • 获取资源的传统方式:
    在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的
    模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效
    率。
  • 反转控制方式获取资源:
    反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主
    动的将资源推送给需要的组件
    ,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源
    的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。

比较抽象,对吧那就看看下面的小例子。


一个小例子,来体会IOC的基础思想。

一个小例子,来体会IOC的基础思想。

dao层

dao层接口

package com.gothic.sunset.dao;

public interface UserDao {

    void getUser();
}

dao层实现类

实现类1:

package com.gothic.sunset.dao;

public class UserDaoImpl implements UserDao{


    @Override
    public void getUser() {
        System.out.println("获取数据信息");
    }
}

实现类2:

package com.gothic.sunset.dao;

public class UserDaoMysqlImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("获取Mysql数据信息");
    }
}

实现类3:

package com.gothic.sunset.dao;

public class UserDaoOracleImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("获取Oracle数据信息");
    }
}

service层

service层接口

package com.gothic.sunset.service;

public interface UserService {

    void getUser();
}

service层实现类

package com.gothic.sunset.service;

import com.gothic.sunset.dao.UserDao;
import com.gothic.sunset.dao.UserDaoImpl;

public class UserServiceImpl implements UserService{

    private UserDao userDao = new UserDaoImpl();
    @Override
    public void getUser() {
        userDao.getUser();
    }
}

测试代码


import com.gothic.sunset.service.UserService;
import com.gothic.sunset.service.UserServiceImpl;

public class MyTest {

    public static void main(String[] args) {
        UserService userService1 = new UserServiceImpl();
        userService1.getUser();
    }
}

运行输出后,发现只能根据上面service层实现类中固定的dao实现类对象来输出。
如果现在我需要里面的实现类对象为实现类2的对象,那么我就需要去修改service层中的实现类,然后如果代码比较多的话,改动会非常大,牵一发而动全身。那么如何解决这一问题呢?
其实可以在service层,通过set注入dao实现类对象来进行,修改如下:

service层实现类修改

package com.gothic.sunset.service;

import com.gothic.sunset.dao.UserDao;
import com.gothic.sunset.dao.UserDaoImpl;

public class UserServiceImpl implements UserService{

    private UserDao userDao ;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void getUser() {
        userDao.getUser();
    }
}

测试代码修改


import com.gothic.sunset.dao.UserDaoImpl;
import com.gothic.sunset.dao.UserDaoMysqlImpl;
import com.gothic.sunset.service.UserService;
import com.gothic.sunset.service.UserServiceImpl;

public class MyTest {

    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(new UserDaoMysqlImpl());//通过set注入将程序主动权释放
        userService.getUser();
    }
}

IOC容器在spring中的简单实现

Spring 的 IOC 容器就是 IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做 bean。在创建bean 之前,首先需要创建 IOC 容器。
Spring 提供了 IOC 容器的两种实现方式:

  • 1.BeanFactory
    这是 IOC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。
  • 2.ApplicationContext
    BeanFactory 的子接口,提供了更多高级特性。面向 Spring 的使用者,几乎所有场合都使用ApplicationContext 而不是底层的 BeanFactory。
    在这里插入图片描述

创建项目

创建一个maven项目,file–>new–>project,然后一直next到finish即可。
在这里插入图片描述

在pom.xml中引入依赖

导入依赖后记得更新依赖。

 	<dependencies>
        <!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.1</version>
        </dependency>
        <!-- junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

实体类创建

第一个例子,当然是helloworld啦!!

package com.gothic.sunset.demo;

public class HelloWorld {

    public void sayHello(){
        System.out.println("HelloWorld!");
    }
}

创建spring的配置文件并且配置bean

在resources目录下,右键选择new–>xml configuration file–>spring config,然后命名为applicationContext.xml.
在applicationContext.xml中,我们需要配置HelloWorld所对应的bean,即将HelloWorld的对象交给Spring的IOC容器管理。
通过bean标签配置IOC容器所管理的bean属性:

  • id:设置bean的唯一标识
  • class:设置bean所对应类型的全类名
<?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">

    <!--
       bean:配置一个bean对象,将对象交给IOC容器来管理
       属性:
       id:bean的唯一标识,不能重复
       class:设置bean对象所对应的类型

   -->
    <bean id="HelloWorld" class="com.gothic.sunset.demo.HelloWorld"></bean>
</beans>

创建测试用例,测试输出


    @Test
    public void testHello(){
    	// 通过ClassPathXmlApplicationContext读取spring配置文件来获取IOC容器
        ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
        HelloWorld helloWorld = (HelloWorld)ioc.getBean("HelloWorld");
        helloWorld.sayHello();
    }

在这里插入图片描述


今天,spring的IOC回顾就到此结束啦!!!!其中的例子只是最简单的例子,后续文章再详细展开。
在这里插入图片描述

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

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

相关文章

C# 拨号面板 高亮显示

一 拨号面板 显示&#xff1a;绘制4x3; 数据&#xff1a;每一格对应一个数字&#xff1b; 行为&#xff1a;点击单元格时有反应&#xff1b; 二 拨号事件 当点击某个号码时&#xff0c;触发拨号事件。 设计思路&#xff1a; ① 重写OnMouseClick(); ② 根据鼠标点击位置&am…

JVET-AB0117-基于模板的帧内推导的方向性融合

本提案是针对 ECM 中的 TIMD&#xff08;基于模板的帧内模式推导&#xff0c;Template based intra mode derivation &#xff09; 的技术的加权方式的改进。具体地&#xff0c;本提案提出使用方向混合&#xff08;directional blending&#xff09;来加权TIMD使用模板推导的两…

SpringBoot SpringBoot 原理篇 1 自动配置 1.13 bean 依赖属性配置

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.13 bean 依赖属性配置1.13.1 环境准备1.13.2 bean 依赖属性配置1…

【软件测试】作为测试人,因工作与开发吵了一架碰撞,该咋办......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试与开发在工作中…

【网页设计】HTML+CSS保护野生动物北极熊介绍网页设计专题

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

傻白入门芯片设计,RDL/Interposer/EMIB/TSV(五)

一、再分配层&#xff08;RDL&#xff09; 主要原理就是在晶片表面沉积金属层和介电层。它形成了一个再分配层&#xff0c;以携带相应的金属布线模式&#xff0c;并在芯片外的松散区域上重新排列芯片的IO端口。由于RDL形成的金属布线的线宽和间距较小&#xff0c;从而提供了更…

MySQL之InnoDB架构浅析

InnoDB是一个兼顾高可靠性和高性能的通用存储引擎。在 MySQL 5.7 中&#xff0c;InnoDB是默认的 MySQL 存储引擎。 InnoDB 的主要优势 支持事物&#xff0c;具备crash-safe的能力支持行锁以及MVCC&#xff0c;具备良好的多用户并发性和性能Buffer Pool&#xff0c;提升热点数…

第8章 综合案例—构建DVD租赁商店数据仓库

目录 章节概要 案例背景介绍 数据仓库的架构模型 数据仓库的架构模型 数据库sakila的下载和安装 数据库sakila简介 数据库sakila中 数据表之间的关系 数据表简介 用于储存电影基本信息及相关介绍的数据&#xff0c;该数据表各个字段的含义如表。 用于储存定义电影id所…

Python爬虫

前言 这个故事&#xff0c;从头讲起。 2022 年上班第一天&#xff0c;我们做了一个重要决定&#xff0c;就是打造精品学习路线&#xff0c;为初学者指明前进的方向&#xff0c;以及常见的避坑技巧。 &#xff08;文末送读者福利&#xff09; 我承认这是一件非常有挑战的事情…

自动驾驶感知算法实战6——目标分类详解(ResNet、VGG、GoogLeNet等)

自动驾驶感知算法实战专栏:https://blog.csdn.net/charmve/category_12097938.html目录 1 网络分类2 详解 ResNet3 详解 VGG4 稠密连接网络(DenseNet)5 详解 GoogLeNet6 详解 Fast R-CNN1 网络分类 来自:https://charmve.github.io/computer-vision-in-action/#/book_prefa…

构建房地产行业智慧采购新模式,采购协同商城系统护航企业采购数字化转型

采购是房地产企业控制成本的龙头&#xff0c;同时还直接影响着工程质量。随着采购工作推进的不断深化&#xff0c;对地产物资采购精细化管理的要求也在日益加强&#xff0c;如何做好采购工作成为房地产企业实现数字化转型升级进程必须突破的壁垒。 房地产作为一个资源整合性行…

排序算法及java实现

简介 排序算是非常基础的算法&#xff0c;为什么我们需要排序算法呢&#xff1f;假设我们只有10个数&#xff0c;或者100个数&#xff0c;其实根本不需要研究这么多的排序算法&#xff0c;正常我们会使用的插入排序或者选择排序足够了&#xff0c;没必要发明快排&#xff0c;基…

第九章 哈希表 AcWing 2 1549. 集合相似度

第九章 哈希表 AcWing 2 1549. 集合相似度 原题链接 AcWing 1549. 集合相似度 算法标签 哈希表 位运算 思路 使用unordered_set数据结构将数据插入指定集合 如何计算Nc&#xff08;两集合交集&#xff09; 如何计算Nt&#xff08;两集合并集&#xff09; 输出问题 WA 精…

干掉 “重复代码”,这三种方式绝了!

软件工程师和码农最大的区别就是平时写代码时习惯问题&#xff0c;码农很喜欢写重复代码而软件工程师会利用各种技巧去干掉重复的冗余代码。 业务同学抱怨业务开发没有技术含量&#xff0c;用不到设计模式、Java 高级特性、OOP&#xff0c;平时写代码都在堆 CRUD&#xff0c;个…

BCD编码和ASCII码

计算机里&#xff0c;字母&#xff0c;各种字符以及指挥计算机执行操作的指令&#xff0c;均用二进制数的组合表示&#xff0c;称为二进制编码 目录 ASCII码&#xff08;汇编语言程序设计的时候会常用&#xff09; BCD码&#xff08;了解&#xff09; ASCII码&#xff08;汇…

等数值计算方法学习笔记第4章第三部分【数值积分(数值微分)】

高等数值计算方法学习笔记第4章第三部分【数值积分&#xff08;数值微分&#xff09;】六、数值微分&#xff08;第四次课&#xff09;1、中点方法与误差分析2、插值型的求导公式3、习题和表格4、知识结构图六、数值微分&#xff08;第四次课&#xff09; 1、中点方法与误差分析…

【图像处理】小波编码图像中伪影和纹理的检测(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

一年一度的科技狂欢盛会——2022亚马逊云科技re:Invent全球大会

一年一度的科技狂欢盛会&#xff0c;2022年亚马逊云科技re:Invent全球大会即将于北京时间2022年11月29日盛大开启&#xff01;届时全球各领域关注“云计算圈”发展的人都将齐聚一堂&#xff0c;共同聆听5大重磅嘉宾的主题演讲&#xff0c;700前沿技术话题…… 携全球合作伙伴&…

《计算机工程》投稿经验分享

历经两个月终于录用了 投稿过程真的太心酸了 第一次投计算机工程与应用&#xff1a;历时两周&#xff0c;拒稿 第二次投计算机科学&#xff1a;加急15天&#xff0c;增刊录用&#xff0c;撤稿 第三次投计算机应用与软件&#xff1a;说文件太大&#xff0c;修改文件大小重投&…

选择合作伙伴是最大关键:网宿科技的云业务拓展之路

关注IT圈子的小伙伴们&#xff0c;对网宿科技这个名字想必都是耳熟能详。在众多发力云计算业务的科技企业当中&#xff0c;近年来业绩表现出众的网宿科技&#xff0c;无疑是相当引人瞩目的一家。那么问题就来了&#xff1a;网宿科技当初是怎样走上了这条云业务拓展之路&#xf…