【持续更新】【知识笔记】Spring框架学习笔记

零、核心

参考视频:黑马程序员SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术

图片[1] - 【持续更新】【知识笔记】Spring框架学习笔记 - 极核GetShell

一、核心容器

1. 概念

IoC控制反转:将对象的创建和管理责任从调用者转移到外部框架或容器。简单来说,就是你不再需要自己创建对象,而是让一个“大管家”(也就是IoC容器)来帮你创建和管理这些对象,被创建或者被管理的对象在Ioc容器中统称为Bean

举个通俗的例子,想象一下你去一家餐厅吃饭:

  • 传统方式(没有IoC):你走进餐厅,自己点菜,然后自己去厨房找厨师做,最后自己端菜上桌。这个过程中,你不仅需要点菜,还要负责整个烹饪和上菜的过程。
  • IoC方式:你走进餐厅,服务员(IoC容器)会帮你点菜,然后厨师(由IoC容器管理的对象)会做菜,最后服务员会把做好的菜端到你面前。在这个过程中,你不需要关心菜是怎么做的,只需要享受美食。

通过IoC,你的代码变得更简洁,因为你不直接创建对象,而是依赖于外部容器来提供这些对象。这样做的好处是:

  • 解耦:你的代码与对象的创建和管理解耦,使得代码更灵活,更容易维护和测试。
  • 可扩展性:当需要更换或添加新的对象时,你不需要修改现有代码,只需要在IoC容器中进行配置即可。
  • 集中管理:所有的对象创建和依赖关系都在一个地方管理,便于集中配置和监控。

DI依赖注入:是实现控制反转(IoC)的一种技术。它是一种设计模式,用于减少代码之间的耦合度,让对象之间的依赖关系更加灵活和可管理。

  • 在容器中简历bean与bean之间的依赖关系的整个过程,称为依赖注入

1.0 基础源码

com.getshell -> APP.java

package com.getshell;

import com.getshell.service.BookService;
import com.getshell.service.impl.BookServiceImpl;
public class APP {
    public static void main(String[] args) {
        BookService bookService = new BookServiceImpl();
        bookService.save();
    }
}

com.getshell.dao -> BookDao.java

package com.getshell.dao;

public interface BookDao {
    void save();
}

com.getshell.dao.impl -> BookDaoImpl.java

package com.getshell.dao.impl;
import com.getshell.dao.BookDao;

public class BookDaoImpl implements BookDao {
    @Override
    public void save() {
        System.out.println("book dao save ...");
    }
}

com.getshell.service -> BookSerivce.java

package com.getshell.service;

public interface BookService {
    void save();
}

com.getshell.service.impl -> BookServiceImpl.java

package com.getshell.service.impl;
import com.getshell.dao.impl.BookDaoImpl;
import com.getshell.dao.BookDao;
import com.getshell.service.BookService;

public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();
    public void save(){
        System.out.println("book service save ...");
        bookDao.save();
    }
}

1.1 Ioc入门案例

pom.xml导入Spring-context依赖包

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.2.0</version>
        </dependency>
    </dependencies>

resources中创建Spring配置文件applicationContext.xml,在文件中配置bean

  • bean标签标识配置bean
  • id表示给bean起名字
  • class属性表述给bean定义类型
    <bean id="bookDao" class="com.getshell.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.getshell.service.impl.BookServiceImpl" />

创建APP2的类,在里面使用bean进行重写

package com.getshell;

import com.getshell.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class APP2 {
    public static void main(String[] args) {
        //获取Ioc容器
        ApplicationContext bookservice = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        bookservice.getBean("bookService");
        //将获取到的东西进行类型转换
        BookService bookService = (BookService) bookservice.getBean("bookService");
        bookService.save();
    }
}

1.2 DI入门案例

重写Service层实现类:删除new关键字,提供对应容器使用赋值的set方法

package com.getshell.service.impl;
import com.getshell.dao.BookDao;
import com.getshell.service.BookService;

public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    public void save(){
        System.out.println("book service save ...");
        bookDao.save();
    }

    // 提供对应的set方法
    // spring容器往里面传入对象
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

继续修改Spring配置文件 ,配置bean属性中的参数,bookService依赖于bookDao,bookService中的对象属性bookDao参照 id为bookDao的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标签标识配置bean-->
<!--    id表示给bean起名字-->
<!--    class属性表述给bean定义类型-->
    <bean id="bookDao" class="com.getshell.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.getshell.service.impl.BookServiceImpl" >
<!--        property标签标识配置当前bean的属性 name表示配置哪一个具体的属性  ref属性表示参照哪一个bean -->
        <property name="bookDao" ref="bookDao"/>
    </bean>
</beans>
图片[2] - 【持续更新】【知识笔记】Spring框架学习笔记 - 极核GetShell

1.3 bean基础配置

图片[3] - 【持续更新】【知识笔记】Spring框架学习笔记 - 极核GetShell

1.4 bean的实例化

  • bean的本质上就是对象,创建bean使用构造方法完成

Spring创建对象时,用的是无参构造方法,私有的构造方法依旧能够调用

若此时将无参构造方法变为有参,则会报错,一般Spring报错从最后看

public class BookDaoImpl implements BookDao {  
  private BookDaoImpl() {  
    System.out.println("book dao constructor running ...");  
  }  
    
  @Override  
  public void save() {  
    System.out.println("book save ...");  
  }  
}
public class AppForScope {  
  public static void main(String[] args) {  
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");  
    BookDao bookDao = (BookDao) ctx.getBean("bookDao");  
  }  
}

1.5 bean生命周期

  • bean生命周期:bean从创建到销毁的整体过程
  • bean生命周期的控制:bean创建后到销毁前做一些事情

在bean中写入两个方法:初始化init()和销毁方法deStory()

public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    public void save(){
        System.out.println("book service save ...");
        bookDao.save();
    }

    // 提供对应的set方法
    // spring容器往里面传入对象
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

在配置文件中配置bean:配置初始化对应的方法init-method 和 销毁对应的方法 destroy-method

<bean id="bookDao" class="com.getshell.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>

销毁Spring容器有多种方法:

一、使用close()方法

ApplicationContext接口中无close()方法,而ClassPathXmlApplicationContext提供了

所以需要改写代码将 ApplicationContext 改为 ClassPathXmlApplicationContext

public class APP2 {
    public static void main(String[] args) {
        //获取Ioc容器
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        ctx.getBean("bookService");
        //将获取到的东西进行类型转换
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();

        ctx.close();
    }
}
THE END
想说的话 1  QQ & 微信交流群: 点击查看加群方式
2  本站运营不易,以真心❤️换真心💕,如果帮助到你,可以 推荐给朋友 或者 开通金贝会员 支持一下本站!
3  请不要进行任何非授权的网络攻击,如果造成任何损失均由使用者本人负责,与本站和原作者无关!
点赞74 分享
茶谈区 共2条

请登录后发表评论