Spring——IOC、HelloSpring_ioc hello-程序员宅基地

技术标签: spring  java  编程语言  ioc  bean  

Spring——IOC、HelloSpring

一、关于Spring

1.简介

欢迎访问百度百科:

网址:https://baike.baidu.com/item/spring%E6%A1%86%E6%9E%B6/2853288?fr=aladdin

学习Spring时需要用到其官网

Spring官网:https://spring.io/projects/spring-framework#overview

2.优点

  • Spring是一个开源的免费的框架(容器)!
  • Spring是一个轻量级的、非入侵式的框架!
  • 控制反转(IOC) , 面向切面编程(AOP)!
  • 支持事务的处理,对框架整合的支持!

总结:Spring就是一个轻量级的控制反转(IOC) 和面向切面编程(AOP)的框架!

3.组成

图1570065822876=================

二、IOC理论推导

目录图:

图1================

以前

  1. UserDao 接口
public interface UserDao {
    
    public void getUser();
}
  1. UserDaoImpl 实现类
public class UserDaoImpl implements UserDao {
    
    public void getUser() {
    
        System.out.println("获得用户数据");
    }
}
public class UserDaoMySqlImpl implements UserDao {
    
    public void getUser() {
    
        System.out.println("MySql获取用户数据");
    }
}
  1. UserService 业务接口
public interface UserService {
    
    public void getUser();
}
  1. UserServiceImpl 业务实现类
public class UserServiceImpl implements UserService {
    

    private UserDao userDao = new UserDaoImpl();

    public void getUser() {
    
        userDao.getUser();
    }
}
  1. 测试
ublic class MyTest {
    
    public static void main(String[] args) {
    
        UserServiceImpl service = new UserServiceImpl();
        service.getUser();
    }
}
更改需求

如果此时用户想要通过Mybatis获取用户数据,此时就需要修改UserServiceImpl 业务实现类为:

public class UserServiceImpl implements UserService {
    

    //private UserDao userDao = new UserDaoImpl();
    private UserDao userDao = new UserDaoMySqlImpl();

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

这时,用户的要求只能通过程序员来进行修改。

总结

在我们以前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!如果程序代码量十分大,修改一次的成本代价十分昂贵!

这种方法的主动权在程序员手中:

图1570068194062

采用IOC思想

  1. UserDao 接口
public interface UserDao {
    
    public void getUser();
}
  1. UserDaoImpl 实现类
public class UserDaoImpl implements UserDao {
    
    public void getUser() {
    
        System.out.println("获得用户数据");
    }
}
  1. UserService 业务接口
public interface UserService {
    
    public void getUser();
}
  1. UserServiceImpl 业务实现类
public class UserServiceImpl implements UserService {
    

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
    
        this.userDao = userDao;
    }
    
    public void getUser() {
    
        userDao.getUser();
    }
}
  1. 测试
public class MyTest {
    
    public static void main(String[] args) {
    
        UserDaoImpl userDao = new UserDaoImpl();

        UserServiceImpl userService = new UserServiceImpl();

        userService.setUserDao(userDao);
        userService.getUser();
    }
}
更改需求

如果此时用户想要通过Mybatis获取用户数据,此时无需修改UserServiceImpl 业务实现类,直接在测试类中 new UserDaoMySqlImpl()类即可,就不需要程序员修改代码,而是把各种功能的类名称暴露给用户,把决定权交给用户。只需要用户自己决定改变的需求即可:

public class MyTest {
    
    public static void main(String[] args) {
    
        //UserDaoImpl userDao = new UserDaoImpl();
        UserDaoMySqlImpl userDaoMySql = new UserDaoMySqlImpl();

        UserServiceImpl userService = new UserServiceImpl();

        userService.setUserDao(userDaoMySql);
        userService.getUser();
    }
}

在业务实现类中,我们添加、使用一个Set接口实现,会发生革命性的变化!

总结
  1. 之前,程序是主动创建对象!控制权在程序猿手上!

  2. 使用了set注入后,程序不再具有主动性,而是变成了被动的接受对象!

这种思想,从本质上解决了问题,我们程序猿不用再去管理对象的创建了。大大降低了系统的耦合性,可以更加专注在业务的实现上!这就是IOC 的原型

图1570068201734

IOC本质

控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。

采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

三、HelloSpring

1.导入Spring相关jar包

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

<!-- 用于测试 -->
<!-- https://mvnrepository.com/artifact/junit/junit -->
 <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
</dependency>

2.编写代码

编写一个Hello实体类
public class Hello {
    
    private String name;

    //使用<bean>,必须有set方法,否则会报错
    public void setName(String name) {
    
        this.name = name;
    }

    public void show() {
    
        System.out.println("Hello" + name);
    }
}
编写我们的spring文件 , 这里我们命名为applicationContext.xml

先进入官网,再依次选择进入即可。
图2=====================

图3======================

图4====================

图5==================

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--name是单个bean的名称,以后进行测试调用时直接传递这个名称即可-->
    <!--class是实体类-->
    <bean name="hello" class="com.cm.pojo.Hello">
        <!--name是实体类中的属性-->
        <!--value是给这个属性赋的具体值-->
        <property name="name" value="Spring"/>
    </bean>

</beans>
进行测试

图6================

@Test
public void test1() {
    
    //这里使用ApplicationContext
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    //这里要进行类型转换
    //传递xml文件中bean的名称即可,得到一个对应类的实际对象
    Hello hello = (Hello) context.getBean("hello");

    //利用对象去调用方法
    hello.show();
}

思考问题 ?

  • Hello 对象是谁创建的 ?

    hello 对象是由Spring创建的。

  • Hello 对象的属性是怎么设置的 ?

    hello 对象的属性是由Spring容器设置的 。

这个过程就叫控制反转 :

控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的 ;

反转 : 程序本身不创建对象 , 而是变成被动的接收对象 ;

依赖注入 : 就是利用set方法来进行注入的;

IOC是一种编程思想 , 由主动的编程变成被动的接收 。

可以通过newClassPathXmlApplicationContext去查看一下底层源码 。

  • 到了现在 , 我们彻底不用在程序中去改动了 , 要实现不同的操作 , 只需要在xml配置文件中进行修改 ;

  • 所谓的IoC,一句话搞定 : 对象由Spring 来创建、管理 、装配 !

四、IOC创建对象的方式

使用无参构造创建对象,默认!

给Hello实体类添加一个无参构造
public class Hello {
    
    private String name;

    public Hello() {
    
        System.out.println("无参构造");
    }

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

    public void show() {
    
        System.out.println("Hello" + name);
    }
}
测试
@Test
    public void test1() {
    
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println("=================");
        Hello hello = (Hello) context.getBean("hello");

        hello.show();
    }
}
运行结果

图7=============

假设我们要使用有参构造创建对象

在实体类中添加有参构造:

public class Hello {
    
    private String name;

    /*public Hello() {
        System.out.println("无参构造");
    }*/

    public Hello(String name) {
    
        this.name = name;
    }

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

    public void show() {
    
        System.out.println("Hello" + name);
    }
}

下面修改xml文件内容即可

  1. 下标赋值
    <!--第一种,下标赋值!-->
    <bean name="hello" class="com.cm.pojo.Hello">
       <constructor-arg index="0" value="Spring"/>
    </bean>
    
  2. 类型
    <!--第二种方式:通过类型创建,不建议使用!-->
    <bean name="hello" class="com.cm.pojo.Hello">
       <constructor-arg type="java.lang.String" value="Spring"/>
    </bean>
    
  3. 参数名
    <!--第三种,直接通过参数名来设置-->
    <bean name="hello" class="com.cm.pojo.Hello">
       <constructor-arg name="name" value="Spring"/>
    </bean>
    

测试方法不变

@Test
public void test1() {
    
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    System.out.println("=================");
    Hello hello = (Hello) context.getBean("hello");

    hello.show();
}

总结:在配置文件加载的时候,容器中管理的对象就已经初始化了

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45683851/article/details/104469381

智能推荐

Coldfusion的基础知识-程序员宅基地

文章浏览阅读430次。什么是ColdFusion?   ColdFusion Web application是帮助你建立实施大规模网站应用系统的最快方式,它集成了浏览器,服务器及数据库技术。从电子商务到商业流程自动化,从Intranets到Internet,ColdFusion都能够帮助你快速、轻松的开发实施先进的应用系统。ColdFusion Studio中的可视化编程工具、数据库和程序调试工具可以帮助实现快速开..._coldfusion

Python 编码转换与中文处理_"python charset=[\"en\", \"cn\"]"-程序员宅基地

文章浏览阅读5.2k次。Python 编码转换与中文处理python 中的 unicode是让人很困惑、比较难以理解的问题. utf-8是unicode的一种实现方式,unicode、gbk、gb2312是编码字符集.decode是将普通字符串按照参数中的编码格式进行解析,然后生成对应的unicode对象写python时遇到的中文编码问题:➜ /test sudo vim test.py#!/usr/bin/..._"python charset=[\"en\", \"cn\"]"

一代「博雅」大师离世!缅怀复旦大学原校长、中国科学院院士杨福家教授-程序员宅基地

文章浏览阅读394次。作者丨Joey 好困来源丨新智元【导读】2022年7月17日,著名核物理学家、复旦大学原校长、中科院院士杨福家在上海因病逝世,享年86岁。据复旦大学消息,著名核物理学家、复旦大学原校长、中国科学院院士杨福家教授于7月17日在上海因病离世,享年86岁。(图源:复旦大学官网)复旦大学官网主页也换成了灰屏,以表达对老先生的哀思。作为原子物理学界研究的带头人,杨福家教授为我国应用..._感光材料工艺大师

SCI-HUA科研绘图技巧丨和“亮瞎眼”的论文插图配色say goodbye_sci地层剖面图配色-程序员宅基地

文章浏览阅读2.4w次,点赞3次,收藏31次。这里我们会多多分享科研插画绘图创作中的实践心得,希望大家的作品都能漂漂亮亮。我们会多多分享科研插画绘图创作中的实践心得,希望大家的作品都能漂漂亮亮。翻过年关,新的毕业季即将来临这又是一个SCI论文插画井喷的时刻,不要让你的画作 “亮”到尴尬哦~插画里尬眼的光辉 -色彩是插画里最具表现力的要素,但是很多科研人员没有接触过设计,当上手制图时,很有可能走入颜色的误区,如..._sci地层剖面图配色

Java 后台调用接口(HTTP请求工具类)_后端调用接口工具类-程序员宅基地

文章浏览阅读900次,点赞4次,收藏3次。网上找的HTTP 请求工具类package com.spt.utils;import org.apache.commons.io.IOUtils;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.NameValuePair;import org.apache.http.client.Http_后端调用接口工具类

linux安装过程中找不到镜像文件(system operation)_linux下载httpd出现找不到镜像-程序员宅基地

文章浏览阅读8.1k次。解决方法:镜像和虚拟机的路径都不要有空格_linux下载httpd出现找不到镜像

随便推点

自动化学习框架(AutoML)的性能比较-程序员宅基地

文章浏览阅读7.2k次,点赞3次,收藏18次。摘要:AutoML作为一个有效的工具可以帮助很多企业方便地实施和加速人工智能方面的应用落地。对于还不具备数据科学团队的公司来说,AutoML可以是全自动化的模型构建工具来..._tpot,h2o,auto sklearn

【图像融合】基于matlab加权平均法图像融合【含Matlab源码 722期】_matlab图像的梯度倒数加权平均法-程序员宅基地

文章浏览阅读5.4k次,点赞6次,收藏21次。加权平均法图像融合完整的代码,方可运行;可提供运行操作视频!适合小白!_matlab图像的梯度倒数加权平均法

Storm整合Springboot_springboot storm-程序员宅基地

文章浏览阅读1.7k次。Storm运行有两种模式,分别是local与remote。因此,Storm与Springboot整合,也分两种方式。local模式整合Springboot,storm与Springboot都运行在同一JVM中,而remote模式整合,Storm的计算节点会在不同的JVM中(跨进程)被初始化并运算。_springboot storm

iphone GNU debugger 1708下载地址-程序员宅基地

文章浏览阅读155次。cydia种添加http://cydia.radare.org源,然后搜索gnu debugger就可以了~~转载于:https://www.cnblogs.com/GrowUP-EveryDay/archive/2013/03/07/2947357.html_gnu project debugger下载

自反+递归 实现评论的无限引用_<div class='comments-list' id='comment-holder'><di-程序员宅基地

文章浏览阅读1.7k次。引言大家每天都在看博客,发表评论,实现一个评论系统也是一名Web开发者的基本要求。虽然评论只是一个很普通的功能,但是实现评论的引用,尤其是无限引用,却有一定的困难。身为“网易工程队”的正规军,同时又作为一名程序开发人员,有必要向大家展示一下“盖楼”的方法。效果预览:http://www.tracefact.net/demo/NestedComment/Default.aspxNOTE:本文使用 基于业务对象(List)的筛选 来进行引用列表的搜寻,对数据库仅进行了一次读取。想也应该能想明白:不管是初始评论还_

C++ STL用法总结_c++中stl用法超详细总结 csdn-程序员宅基地

文章浏览阅读417次。C++ STL用法总结************ 写在前面*************1、STL的概念2、STL的内容2.1、容器2.2、迭代器2.3、算法2.4、仿函数2.4.1、概述2.4.2、仿函数的使用2.4.3、内建仿函数2.5、适配器2.6、分配器3、常用容器3.1、string容器3.1.1、跟char*型的字符串作对比:3.1.2、与char*型的相互转换:3.1.3、string的使用3.2、vector(向量)3.2.1、vector的底层结构3.2.2、vector的使用3.3、deque_c++中stl用法超详细总结 csdn