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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Spring框架中IOC(控制反转)的思想和实现,通过一个简单的例子展示了如何通过IOC容器管理对象依赖,从而提高代码的灵活性和可维护性。

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回顾就到此结束啦!!!!其中的例子只是最简单的例子,后续文章再详细展开。
在这里插入图片描述

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
21天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
31 0
|
2月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
135 9
|
2月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
32 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
3月前
|
缓存 Java Spring
手写Spring Ioc 循环依赖底层源码剖析
在Spring框架中,IoC(控制反转)是一个核心特性,它通过依赖注入(DI)实现了对象间的解耦。然而,在实际开发中,循环依赖是一个常见的问题。
42 4
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
73 0
|
2月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
47 0
|
2月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
82 0
|
2月前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
50 0
|
Java 数据格式 容器
重新学习之spring第一个程序,配置IOC容器
第一步:导入相关jar包(此范例导入的是spring3.2.4版本,spring2.5版本只需要导入spring核心包即可)     第二步:在项目的src下配置applicationContext.
943 0