JavaEE-Spring(IoC控制反转,DI依赖注入,Spring项目创建和基本使用,ApplicationContext和BeanFactory的区别)

1. IoC

Spring是一个包含多个工具方法的IoC容器

tomcat是web容器
List/Map是数据存储容器

IoC:Inversion of Control(控制反转)
将对象的控制权交给Spring,自己不在需要管理所有的对象。


在程序开发中,经常出现一个对象的创建依赖另一个对象的情况,如果采用在对象内new依赖对象,这样会导致代码的耦合性比较高。
底层依赖初始化发生改变,会导致整体改变。

可以选择通过传参的方式,将依赖的对象以参数的形式传递进来。这样依赖的对象发生改变,上层代码不需要改变。

上述过程就是一种控制权反转过程,将依赖对象的控制权反转。达到解耦目的。
这就是IoC的思想

IoC的优点:

  1. 实现代码解耦
  2. 对象的声明周期交给IoC框架维护,不需要关注对象的声明周期。

Spring IoC的核心功能

  1. 将对象存储到Spring中
  2. 将对象从Spring中取出

学习Spring的核心就是学习如何将对象存放到Spring中,再从Spring中取出对象的过程

DI

DI:Dependency Injection 依赖注入

依赖注入:IoC运行器件,动态的将某种关系注入到对象中,通过引入Ioc容器,利用依赖关系注入的方式实现对象的解耦。

IoC与DI的区别是什么

  1. IoC是实现目标的一种思想,DI就是具体实现

2. Spring项目创建和使用

创建Spring核心项目,将对象存储到Spring中,从Spring中取出对象

创建项目:

  1. 首先创建maven项目
  2. 添加spring框架支持(spring-context、spring-beans)
  3. 创建启动类,添加main方法

注意:如果没有梯子,需要切换maven国内源,这里并不在介绍。
如果包下载失败,找到setting,找到本地仓库,将本地仓库全部删除后重新下载

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>
</dependencies>

将对象储存到Spring中

  1. (首次)在Spring项目中添加配置文件
  2. 创建Java对象
  3. 在配置文件中将要保持到Spring中的Java对象进行注册

在Spring项目中添加配置文件:resource文件下新增文件,这个文件名称为xxx.xml(这里以spring.xml举例)
在这里插入图片描述
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 http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

创建Java对象:
在这里插入图片描述
将对象通过配置文件,注册到Spring中
在这里插入图片描述
bean标签就是代表注册对象。

id属性类似于key,value。从Spring中拿注册的对象就是靠id属性。
class属性指的是要注册的Java类名。
id和class类名可以不同,二者没有任何关系。一般id为小驼峰,类名使用大驼峰。

从Spring中将对象取出:

  1. 得到Spring上下文对象
  2. 通过上下文对象提供的方法,获取Spring中需要的Java对象,并使用。

获取Spring上下文对象

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

public class FirstSpring {
    public static void main(String[] args) {
        System.out.println("Hello Spring");
        //获取Spring上下文对象,传入Spring配置文件名称,这里是spring.xml
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

        //通过上下文对象提供的方法获取需要的对象,传递对象id值,不是类名
        user u = (user) context.getBean("userInfo");

        u.Print("Spring");
    }
}

在这里插入图片描述

由上图可知,对象通过Spring获取,实现了解耦。

此外Spring上下文信息不仅仅可以通过ApplicationContext获取,还可以通过BeanFactory来获取。

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

public class FirstSpring {
    public static void main(String[] args) {
        System.out.println("Hello Spring");
        //获取Spring上下文对象,传入Spring配置文件名称,这里是spring.xml
        //ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        //通过上下文对象提供的方法获取需要的对象,传递对象id值,不是类名
//        user u = (user) context.getBean("userInfo");

        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring.xml"));

        user u = (user) factory.getBean("userInfo");
        u.Print("Spring");
    }
}

ApplicationContext和BeanFactory的区别

相同点:都可以从容器中获取对象,都提供了getBean方法

不同点:

  1. ApplicationContext是BeanFactory的子类

    BeanFactory只提供基础访问bean对象方法

    ApplicationContext在BeanFactory的基础上提供了更多的方法实现(国际化支持,资源访问支持等)

  2. BeanFactory是按需加载对象bean,ApplicationContext是饿汉模式,在创建时会将所有的Bean对象加载起来。

    ApplicationContext业务响应快,系统资源开销大

    BeanFactory节省系统资源,业务响应懒加载模式,响应慢。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NUC_Dodamce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值