Spring Framework(Bean)

1.初始Spring

  • 官网:Spring.io
  • Spring发展到今天已经形成了一种开发的生态圈,Spring提供了若干个项目,每个项目用于完成特定的功能

2.Spring Framework系统架构

  • SpringFramework是Spring生态圈中最基础的项目,是其他项目的根基

3.Spring Framework 核心概念

问题与解决方案

  • 代码书写现状
    • 耦合度偏高
  • 解决方案
    • 使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象
  • IoC(Inversion of Control)控制反转
    • 对象的创建控制权由程序转移到外部,这种思想称为控制反转

IoC(Inversion of Control)控制反转

  • 使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转

Spring技术对Ioc思想进行了实现

  • Spring提供了一个容器,称为Ioc容器,用来充当Ioc思想中的外部
  • IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean

DI(Dependency Injection)依赖注入

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

目标:充分解耦

  • 使用IoC容器管理bean(IoC)
  • 在IoC容器内将有依赖关系的bean进行关系绑定(DI)

最终效果

  • 使用对象时不仅可以直接从Ioc容器中获取,并且获取到的bean已经绑定了所有的依赖关系

4.IoC入门案例

IoC入门案例思路分析

  • 1.管理什么?(Service与Dao)
  • 2.如何将被管理的对象告知IoC容器?(配置)
  • 3.被管理的对象交给IoC容器,如何获取到IoC容器?(接口)
  • 4.IoC容器得到后,如何从容器中获取bean?(接口方法)
  • 5.使用Spring导入哪些坐标?(pom.xml)

pom.xml:

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.javadan</groupId>
    <artifactId>spring_01_quickstart</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.29</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>


    </dependencies>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

resources/applicationContext.xml:

XML 复制代码
<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">
    <!--1.在pom.xml中导入spring的坐标spring-context,对应版本是5.3.29    -->

    <!--2.配置bean    -->
<!--    bean标签表示配置bean-->
<!--    id属性表示给bean起名字-->
<!--    class属性表示给bean定义类型-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>

    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/>


</beans>

BookDao.java:

java 复制代码
package com.itheima.dao;

public interface BookDao {
    public void save();
}

BookDaoImpl.java:

java 复制代码
package com.itheima.dao.impl;

import com.itheima.dao.BookDao;

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

BookService.java:

java 复制代码
package com.itheima.service;

public interface BookService {
    public void save();
}

BookServiceImpl.java:

java 复制代码
package com.itheima.service.impl;

import com.itheima.dao.BookDao;
import com.itheima.dao.impl.BookDaoImpl;
import com.itheima.service.BookService;

public class BookServiceImpl implements BookService {

    private BookDao bookDao = new BookDaoImpl();
    @Override
    public void save() {
        System.out.println("book service save...");
        bookDao.save();
    }
}

App.java:

java 复制代码
package com;

import com.itheima.service.BookService;
import com.itheima.service.impl.BookServiceImpl;

public class App {
    public static void main(String[] args) {
        BookService bookService = new BookServiceImpl();
        bookService.save();
    }
}

App2.java:

java 复制代码
package com;

import com.itheima.dao.BookDao;
import com.itheima.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App2 {
    public static void main(String[] args) {
        //3.获取IoC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        //4.获取bean
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();

        System.out.println("---------");

        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();


    }
}

5.DI入门案例

DI入门案例思路分析

  • 1.基于Ioc管理bean
  • 2.Service中使用new形式创建的Dao对象是否保留?(否)
  • 3.Service中需要的Dao对象如何进入到Service中?(提供方法)
  • 4.Service与Dao间的关系如何描述?(配置)

DI案例实在IoC案例的代码基础上改的

①删除使用new的形式创建对象的代码(BookServiceImpl.java)

②提供依赖对象对应的setter方法(BookServiceImpl.java)

java 复制代码
package com.itheima.service.impl;

import com.itheima.dao.BookDao;
import com.itheima.service.BookService;

public class BookServiceImpl implements BookService {

    //5.删除业务层中使用new的方式创建的dao对象
    private BookDao bookDao ;

    @Override
    public void save() {
        System.out.println("book service save...");
        bookDao.save();
    }

    //6.提供对应的set方法
    public void setBookDao(BookDao bookDao){
        this.bookDao = bookDao;
    }
}

③配置service和dao之间的关系(applicationContext.xml)

XML 复制代码
<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">
    <!--1.在pom.xml中导入spring的坐标spring-context,对应版本是5.3.29    -->

    <!--2.配置bean    -->
<!--    bean标签表示配置bean-->
<!--    id属性表示给bean起名字-->
<!--    class属性表示给bean定义类型-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>

    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<!--    7.配置Service与dao 的关系    -->
<!--        property标签表示配置当前bean的属性-->
<!--        name属性表示配置哪一个具体的属性-->
<!--        ref属性表示参照哪一个bean-->
        <property name="bookDao" ref="bookDao"/>
    </bean>


</beans>

6.Bean的基础配置

bean的基础配置

类别 描述
名称 bean
类型 标签
所属 beans标签
功能 定义spring核心容器管理的对象
格式 <beans> <bean/> <bean></bean> </beans>
属性 id:bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id值唯一列表 class:bean的类型,即配置的bean的全路径类名
范例 <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"></bean>

bean的别名配置

类别 描述
名称 name
类型 属性
所属 bean标签
功能 定义bean的别名,可定义多个,使用逗号(,)分号(;)空格( )分隔
范例 <bean id="bookDao" name="dao bookDaoImpl" class="com.itheima.dao.impl.BookDaoImpl"/> <bean name="service,bookServiceImpl" class="com.itheima.service.impl.BookServiceImpl"/>

注意事项

获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常NoSuchBeanDefinitionException

NoSuchBeanDefinitionException: No bean named 'bookServiceImpl' available

bean作用范围配置

类别 描述
名称 scope
类型 属性
所属 bean标签
功能 定义bean的作用范围,可选范围如下 * siggleton:单例(默认) * prototype:非单例
范例 <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype" />

bean作用范围说明

  • 为什么bean默认为单例?
  • 适合交给容器进行管理的bean

表现层对象

业务层对象

数据层对象

工具对象

  • 不适合交给容器进行管理的bean

封装实体的域对象

7.bean的实例化--构造方法(常用)

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

提供可访问的构造方法(可不写无参构造,前提是没有写有参构造)

配置

8.bean的实例化--静态工厂(了解)

  • 静态工厂
  • 配置

9.bean的实例化--实例工厂(了解)

  • 实例工厂
  • 配置

10.bean的实例化--FactoryBean(实用)

  • FactoryBean
  • 配置

11.bean的生命周期

  • 生命周期:从创建到消亡的完整过程

  • bean生命周期:bean从创建到销毁的整体过程

  • bean生命周期控制:在bean创建后到销毁前做一些事情

  • 提供生命周期的控制方法

  • 配置生命周期控制方法

或者接口控制(了解)

  • 实现InitializingBean,disposableBean接口

bean生命周期

  • 初始化容器

1.创建对象(内存分配)

2.执行构造方法

3.执行属性注入(set操作)
4.执行bean初始化方法

  • 使用bean

1.执行业务操作

  • 关闭/销毁容器

1.执行bean销毁方法

bean销毁时机

  • 容器关闭前触发bean的销毁
  • 关闭容器俩种方式:

①手工关闭容器

ConfigurableApplicationContext接口close()操作

②注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机

ConfigurableApplicationContext接口registerShutdownHook()操作

相关推荐
道清茗1 小时前
【RH294知识点汇总】第 7 章 《 使用角色和 Ansible 内容集合简化 Playbook 》
java·前端·ansible
前端那点事2 小时前
彻底弄懂async/await!解决回调地狱,Vue异步开发必备(超全实战)
前端·vue.js
南境十里·墨染春水2 小时前
linux学习进展 线程同步——条件变量
java·开发语言·学习
窥视未来2 小时前
MySQL 性能调优完全指南:从硬件到 SQL,一篇吃透
java·数据库
普修罗双战士2 小时前
【开发工具IDEA调试,高频使用, IntelliJ IDEA 调试快捷键完全指南】
java·开发语言·intellij-idea
A_nanda2 小时前
VS2022安装QT6.5.3后,如何更新项目配置
前端·javascript·vue.js
ZC跨境爬虫2 小时前
UI前端美化技能提升日志day8:(Watch专区字体优化+尺寸校准+视觉重构+结构分层)
前端·ui·重构·html
XS0301062 小时前
Java 基础(十)异常
java·开发语言·oracle
_F_y2 小时前
C++11 异步操作实现线程池
java·jvm·c++