Spring(一)——简介、IOC(控制反转)、DI(依赖注入)

Ⅰ、简介

在这里插入图片描述
即——Spring框架是一个轻量级、一站式、企业级应用、模块化、非侵入式的框架。

轻量级:其实代码量很大,但是因为它是模块化的框架,所以说它是轻量级框架;
一站式:一步到位,提供全方位服务,spring提供开发整个web企业项目所需要的所有模块;
企业级应用:企业JavaWeb项目开发;
非侵入式:不会因为引入spring框架而影响已经写好的业务逻辑。

相关模块
在这里插入图片描述

Ⅱ、核心容器IOC 0

一、简述

控制反转(Inversion of control),自定义类的权力交给IOC容器,由spring容器来创建类,从而降低类与类之间的联系,松耦合性。

举例说明——
      今天穿鞋子的时候,有一支袜子找不到了,于是,“妈,你看到我另一支袜子没有,帮我找一找。没找到就再帮我买几双好看的袜子。” 放学回家,看见鞋柜上放着一盒袜子,我又问我妈妈,“妈,袜子没找到吗?这是又买了几双哦。”到此结束,整个过程中我没关心怎么找的,没找到(异常)的情况下又是怎么买的(处理异常)。
      控制反转(IOC)一样的道理,将主动权交出(交给我妈妈,我需要好看的袜子,她就帮我买好看的袜子,具体是不是自己想要的好看的袜子,这个就……),过程是什么样子的其实不怎么不关心(怎么找的,在哪找的,找了多久,怎么买的……),只需要得到结果(没找到,买了新的袜子)即可。如果结果不好,可以再次申请(比如,袜子比较老气,我可以送给我爸爸,再请求我妈妈重新购买青春活力的好看的袜子)

疑惑——
1、管理流程是什么样的?
创建实例——>初始化实例——>容器中获取实例——>使用

2、哪些实例对象需要交给IOC?
全局实例对象,需要放在容器中。服务器关闭时,自动销毁(应用在javaWeb中,类似域对象Application(ServletContext),整个服务器内有效,服务器关闭时失效)。

3、spring整合其他框架是什么意思?
将其他框架(工具类)交给IOC管理。



初次接触spring IOC,下面使用案例来说明

pom.xml

<!--测试springIOC,3个jar包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.1.7.RELEASE</version>
        </dependency>

StudentDaoImpl.java

public class StudentDaoImpl implements StudentDao {
   
   
    @Override
    public void insertStudent() {
   
   
        System.out.println("添加学生成功");
    }
}

springConfig.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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop 
https://www.springframework.org/schema/aop/spring-aop.xsd 
http://www.springframework.org/schema/context 
https://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="studentDao" class="com.hbw.dao.StudentDaoImpl"></bean>

</beans>

测试

@Test
public void test1(){
   
   
    //使用IOC提供的API读取配置文件,完成初始化实例
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springConfig.xml");
    //获取实例,并使用
    StudentDao studentDao = (StudentDao) applicationContext.getBean("studentDao");
    studentDao.insertStudent();
}

二、IOC中常用的API 0

BeanFactory:核心API,提供了创建并管理所有实例。
*ApplicationContext:是BeanFactory的子接口,提供了创建并管理(生命周期),程序员自定义的所有实例。

其中三个实现类:
	*ClassPathXMlApplication:根据类路径(Resources、Classes文件夹)解析配置文件,初始化容器(实例化)。
	FileSystemXMlApplication:根据文件路径(D://…)解析配置文件。
	AnnotationConfigApplication:通过读取注解配置,初始化容器。
	提供close方法,但是不会手动调用,全局对象在服务器关闭时自动销毁(应用在javaWeb中类似域对象Application(ServletContext),整个服务器内有效,服务器关闭时失效)。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springConfig.xml");

三、IOC原理

1)👇使用一般的实例化,当该类发生变化时,实例化的地方都需要改变TestDaoImpl tdi = new TestDaoImpl();。耦合性高。
2)👇使用接口编程的思想实例化,当该类发生改变时,只需要改变TestDao td = new TestDaoImpl();实例化的一部分。耦合性较高。
3)👇使用第三方类(工厂类)实例化需要的类TestDao td = new TestFactory().getTestDaoImpl(),当实例化的类发生改变时,只需要修改工厂里面的部分内容即可。
TestFactory.java

public class TestFactory {
   
   
    public StudentDao getStudentDaoImpl(){
   
   
        return new StudentDaoImpl();
    }
}

测试

 @Test
    public void test2(){
   
   
        StudentDao studentDao = new TestFactory().getStudentDaoImpl();
        studentDao.insertStudent();
    }

4)👇上分使用工厂类只能创建一种类,需要创建其他类时,又需要创建新的工厂,效率比较低。所以创建一个生产任意类的工厂,但是在使用该工厂实例化时,需要传入需要实例化类的全类名(反射)进行硬编码,使用时比较麻烦(每次都要传入全类名)。
TestFactory.java

 /*获取任意实例*/
    public Object getObjectImpl(String impl){
   
   
        Object object = null;
        try {
   
   
            //获取字节码文件
            Class clazz = Class.forName(impl);
            //实例化
            object = clazz.newInstance();

        } catch (ClassNotFoundException e) {
   
   
            e.printStackTrace();
        } catch (IllegalAccessException e) {
   
   
            e.printStackTrace()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈年_H

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

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

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

打赏作者

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

抵扣说明:

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

余额充值