Spring之IOC/DI(控制反转/依赖注入)详解、手把手带你进行第一个Spring程序HelloSpring的编写、依赖注入的两种方法

1、Spring

1.1、简介

  • Spring:春天------> 意为给软件行业带来了春天!

Rod Johnson ,Spring Framework创始人,著名作者。他是悉尼大学的一个音乐学的博士,没错,他的专业不是计算机,而是音乐学。
所以大家不要把Spring想的太难,毕竟不是一个领域的人搞出来的,大家还怕学不会吗~

Spring理念:使现有的技术更加容易使用,就为了简化程序员的开发,本身是一个大杂烩,整合了现有的技术框架!
官网:https://spring.io/

1.2、优点

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

Spring可以使Java程序更加快速,简练,安全,是世界上最受欢迎的Java框架

在这里插入图片描述

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

1.3、组成

打开官网,我们可以看到它里面的project还是很多的
在这里插入图片描述

2、什么是IOC?

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

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

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

IOC容器 : 控制反转思想 由主动的编程变成被动的接收
IOC思想的具体实现: 本质是DI(依赖注入) 就是set方法

我们以前想要获取对象是不是要去new一个对象,在学了IOC容器之后,我们再想获取对象,就直接从IOC这个容器中拿就行了,就是它已经帮我们创建好了,我们直接拿过来用就OK!

举个栗子:
以前人们干啥都是自己动手丰衣足食的一种思想,想要什么就自己做一个
而现在呢,大部分人动根手指都觉得累,但是懒人也有懒人的办法,这不马云爸爸开了个“小商店”嘛,他们就直接在上面买就行了

是不是别人帮他做好了,他直接拿来用就行了,就是这么一种懒人思想,大家能理解吧!

3、HelloSpring程序的编写(属性注入的两种方法)

大概了解了Spring和IOC的概念之后,可能有小伙伴还不太清楚,接下来我们用程序体现一下这个思想大家就会想明白啦!

3.1、set注入

3.1.1、创建一个maven项目,导入依赖

如果还有人不会创建maven项目,可以参考我的上一篇博客导入Spring相关的jar包(依赖)

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.10.RELEASE</version>
</dependency>

3.1.2、编写Spring配置文件applicationContext.xml

<?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">
        <!--这里写bean
	大家不要觉得bean很陌生,其实一个bean就是一个Java对象,由Spring创建和管理
	id是唯一标识,class连接的实体类,就创建了一个名为hello的Hello对象
-->
<!--
Hello hello = new Hello();   第一行相当于
hello.setName(Spring)        第二行相当于
-->
        <bean id="hello" class="com.gang.pojo.Hello">
    		<property name="name" value="Spring"/>
	</bean>
</beans>

这个在官网上也可以找到,不用记直接去官网复制即可,把里面没用的东西删掉。在这里插入图片描述

3.1.3、编写Hello实体类

package com.gang.pojo;
/*
Description:实体类
Author:32259
Time:2020二月2020/2/2313:43
*/
public class Hello {
	public Hello(){
    System.out.println("无参构造被执行了!");
}
    private String name;
    public void setName(String name){
        this.name = name;
    }
    public void show(){
        System.out.println("Hello,"+name);
    }
}

3.1.4、编写测试类和测试方法

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {

@Test
public void testHello(){
//加载配置文件进来,就是连接到IOC容器
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    System.out.println("===================");
    //容器中通过唯一标识拿到hello这个对象
    Hello hello = (Hello) context.getBean("hello");
    
    hello.show();
 } 
 
}

3.1.5、查看结果,解决疑惑!

好,运行程序看结果!
在这里插入图片描述
那么问题来了

  • 1.hello对象是由谁创建的 ?
    • 分析运行结果,可以发现是Spring创建的,调用了无参构造,但是我们并没有去new一个对象!这就是IOC~
  • 2.hello对象的属性是怎么设置的?
    • 由Spring容器设置的,使用了set方法,所以set方法一定要有

Spring的set注入,其实就是使用无参构造创建一个对象,然后用set方法去给属性设值!Spring默认采用set注入~

3.2、构造器注入

那么除了set注入以外

Spring还有一种构造器注入,本质就是直接用有参构造创建对象,值通过参数传进去!

那么在以上的基础上,我就直接改一下代码,不重新写了,大家注意观察对比!

3.2.1、改变applicationContext.xml文件中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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="hello" class="com.gang.pojo.Hello">
	<!--无参    set注入-->
	<!--        <property name="name" value="Spring"/>    -->
	<!--有参    构造器注入-->
    	<constructor-arg name="name" value="Spring"/>
	</bean>
</beans>

3.2.2、在实体类中加入有参构造

package com.gang.pojo;
/*
Description:实体类
Author:32259
Time:2020二月2020/2/2313:43
*/
public class Hello {
    private String name;
    public Hello(String name) {
        System.out.println("有参构造被执行了!");
        this.name = name;
    }
    public Hello(){
        System.out.println("无参构造被执行了!");
    }
    public void setName(String name){
        this.name = name;
    }
    public void show(){
        System.out.println("Hello,"+name);
    }
}

3.2.3、查看结果

测试类不需要改变,执行测试方法,看结果

在这里插入图片描述
这两种注入方式选一样即可!!!

4、总结

好了,通过程序,我们是否对控制反转和依赖注入有了一些了解了呢?

  • 控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的 .
  • 反转 : 程序本身不创建对象 , 而变成被动的接收对象 .
  • 依赖注入 : 就是利用set方法或构造器来进行注入的.

到现在,我们发现要实现不同的操作 , 只需要在xml配置文件中进行修改即可,不需要再去改程序了!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值