程序员书籍笔记 程序员书籍笔记
  • HTML
  • CSS
  • JavaScript
  • 前端知识
  • Vue
  • MarkDown
  • git
  • Node.js
  • Linux
  • 51单片机
  • 四级
  • 第一学期课程
  • 操作系统
  • 计算机网络
  • 数据结构
  • 计算机组成原理
  • HTML5
  • Electron
  • 日记便签
  • 前端导航
GitHub (opens new window)
  • HTML
  • CSS
  • JavaScript
  • 前端知识
  • Vue
  • MarkDown
  • git
  • Node.js
  • Linux
  • 51单片机
  • 四级
  • 第一学期课程
  • 操作系统
  • 计算机网络
  • 数据结构
  • 计算机组成原理
  • HTML5
  • Electron
  • 日记便签
  • 前端导航
GitHub (opens new window)
  • Vue

  • Nuxt

  • Echarts

  • Node

  • git

  • express

  • 微信小程序

  • Spring

    • Spring基础01
      • Spring框架
      • 核心容器
        • 核心概念
        • Bean实现
        • DI实现
        • 额外扩展
      • Bean实例化
        • 构造方法
        • 静态工厂方法
        • 实例工厂方法
      • Bean生命周期
        • 手动绑定
        • 实现接口
        • 摧毁时机
      • DI依赖注入
      • 自动装配
      • 集合注入
        • 数组
        • List
        • Set
        • Map
        • Properties
    • Spring基础02
    • Spring基础03
    • SpringMVC基础01
    • SpringMVC基础02
    • Mybatis基础01
    • MybatisPlus基础01
    • SpringBoot快速开始
  • 后端知识

  • Markdown

  • project

  • 自用文档查询

  • 框架和软件
  • Spring
yuadh
2022-09-18
目录

Spring基础01

# Spring框架

Spring 是 javaEE 必备技能

  • 简化开发 (IOC\DI、AOP)
  • 框架整合 (事务处理)

Spring 框架架构

image-20210729172352627.png

Spring 学习

  1. 核心容器:核心概念(IOC/DI) 、容器的基本操作
  2. AOP :核心概念、AOP 基础操作、AOP实用开发
  3. 事务:事务使用开发
  4. 整合:整合数据层技术 MyBatis
  5. 全家桶:SpringMVC 、 SpringBoot

# 核心容器

# 核心概念

1663504367167.png

传统 javaweb 开发三层业务层耦合度高

为了解决这类问题,在程序中不主动使用 new 产生对象,转换为由外部提供对象,这就是 Spring 容器的核心概念

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

对 IOC 思想得实现:

提供一个容器,称之为 IOC 容器,该容器负责对象的创建、初始化的等一些列工作,被创建或管理的对象在 IOC 容器中成为 Bean

DI : 依赖注入,在容器创立 bean 与 bean 之间的依赖关系的整个过程,称之为依赖注入

实现的最终效果

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

# Bean实现

控制反转,将对象创建的方式交给Bean实现

  1. meavn导入Spring
<dependencies>
    <!--导入spring的坐标spring-context,对应版本是5.2.10.RELEASE-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
</dependencies>
1
2
3
4
5
6
7
8
  1. 定义基础类

DAO层

public interface BookDao {
    public void save();
}

public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}
1
2
3
4
5
6
7
8
9

Service层

public interface BookService {
    public void save();
}

public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}
1
2
3
4
5
6
7
8
9
10
11
  1. 创建 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 http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <!--
		bean标签:表示配置bean
    	id属性:表示给bean起名字
    	class属性:表示给bean定义类型
	-->
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"></bean>

</beans>
1
2
3
4
5
6
7
8
9
10
11
12
13
  1. 在 main 文件中初始化 IOC 容器,获取 Bean 对象
public class App {
    public static void main(String[] args) {
        //1.创建IoC容器对象,加载spring核心配置文件
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2 从IOC容器中获取Bean对象(BookService对象)
        BookService bookService= (BookService)ctx.getBean("bookService");
        //3 调用Bean对象(BookService对象)的方法
        bookService.save();
    }
}
1
2
3
4
5
6
7
8
9
10

# DI实现

依赖注入,将对象属性设置用Spring实现

  1. 删除 Service 层对 DAO 层对象的 new 对象方式
public class BookServiceImpl implements BookService {
    private BookDao bookDao;  //【第一步】删除使用new的形式创建对象的代码
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}
1
2
3
4
5
6
7
  1. 提供依赖对象对应的 setter 方法
public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
    //【第二步】提供依赖对象对应的setter方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}
1
2
3
4
5
6
7
8
9
10
11
  1. 设置 spring 配置文件
<?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
    	id属性:表示给bean起名字
    	class属性:表示给bean定义类型
	-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>

    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <!--配置server与dao的关系
			property标签:表示配置当前bean的属性
        	name属性:表示配置哪一个具体的属性
        	ref属性:表示参照哪一个bean
		-->
        <property name="bookDao" ref="bookDao"/>
    </bean>
</beans>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 额外扩展

# 别名

Bean 可以起多个别名,使用 , ; space 分割

 <bean id="bookDao" name="book4 bookX" class="com.yuadh.DAO.impl.BookDaoImpl"></bean>
1

使用

ctx.getBean('book4')
1

# 作用范围

scope 属性可以通知,bean 的创建次数

  • singleton 默认,创建单例

  • prototype 非单例

扩展:scope的取值不仅仅只有singleton和prototype,还有request、session、application、 websocket ,表示创建出的对象放置在web容器(tomcat)对应的位置。比如:request表示保存到request域中。

BookService bookService = (BookService) ctx.getBean("bookService");
BookService bookService = (BookService) ctx.getBean("bookService");
1
2

如果两次打印的结果地址值不一致,说明是非单例模式,但是一般都是使用单例模式

# Bean实例化

Bean实例化有多种方法

# 构造方法

如上快速入门

public class AppForInstanceBook {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao = (BookDao) ctx.getBean("bookDao");

        bookDao.save();
    }
}
1
2
3
4
5
6
7
8
9

# 静态工厂方法

工厂类

public class BookDaoImplFatory {
    public static BookDao getBookDI() {
        System.out.println("producte loading...");
        return new BookDaoImpl();
    }
}
1
2
3
4
5
6

配置文件

 <bean id="bookDao" class="com.yuadh.DAO.Fatory.BookDaoImplFatory" factory-method="getBookDI"></bean>
1

测试类

BookDao bookDao =  (BookDao) ctx.getBean("bookDao");
1

# 实例工厂方法

工厂类

public class BookDaoImplFatory {
    public  BookDao getBookDI() {
        System.out.println("producte loading...");
        return new BookDaoImpl();
    }
}
1
2
3
4
5
6

配置文件

<bean id="bookFactory" class="com.yuadh.DAO.Fatory.BookDaoImplFatory"/>
<bean id="bookDao" factory-method="getBookDI" factory-bean="bookFactory"/>
1
2

测试类

BookDao bookDao =  (BookDao) ctx.getBean("bookDao");
bookDao.save();
1
2

# Bean生命周期

# 手动绑定

public class BookDaoImpl implements BookDao {
    @Override
    public void save() {
        System.out.println("book dao save...");
    }
    public void init(){
        System.out.println("Bean init...");
    }
    public void destory(){
        System.out.println("Bean destory");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

配置文件

 <bean id="bookDao1" class="com.yuadh.DAO.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
1

绑定了Bean初始化和销毁时的绑定函数

# 实现接口

public class BookDaoImpl implements BookDao , InitializingBean, DisposableBean {

    @Override
    public void save() {
        System.out.println("book dao save...");
    }
    @Override
    public void destroy() throws Exception {

    }
    @Override
    public void afterPropertiesSet() throws Exception {

    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 摧毁时机

手动关闭

ConfigurableApplicationContext接口close()操作

关闭钩子

ConfigurableApplicationContext接口registerShutdownHook()操作

//注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
ctx.registerShutdownHook();
1
2

# DI依赖注入

DI依赖注入有多多种方式

  • setter 简单类型
  • 构造器 简单类型、引用类型

# setter注入

给Bean实例对象类设置 set 方法,在配置文件中设置 property

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

    public void setBookDao(BookDaoImpl bookDao) {
        this.bookDao = bookDao;
    }
}
1
2
3
4
5
6
7
8
9
10
11

配置文件

<bean id="bookService" class="com.yuadh.Service.impl.BookServiceImpl">
     <property name="bookDao" ref="bookDao1"></property>
</bean>
1
2
3

简单类型注入

<bean id="bookService" class="com.yuadh.Service.impl.BookServiceImpl">
    <property name="bookDao" ref="bookDao1"></property>
    <property name="count" value="10"></property>
</bean>
1
2
3
4

# 构造器注入

在Bean类中定义构造方法,配置文件使用 constructor-arg 标签

public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    private  int count=0;

    public BookServiceImpl(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}
1
2
3
4
5
6
7
8

配置文件

<bean id="bookService" class="com.yuadh.Service.impl.BookServiceImpl">
        <constructor-arg name="bookDao" ref="bookDao"></constructor-arg>
    </bean>
    <bean id="bookDao" class="com.yuadh.DAO.impl.BookDaoImpl"/>
1
2
3
4

简单类型和setter注入一致

 <constructor-arg name="count" value="10" />
1

constructor-arg 属性的参数配置

  • type 属性 指定类型
  • index 属性 指定参数位置注入

# 自动装配

自动装配,自动注入依赖

IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配

<bean id="bookDao" class="com.yuadh.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.yuadh.service.impl.BookServiceImpl" autowire="byType"/>
1
2
  • 不能对简单类型进行操作
  • 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
  • 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
  • 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

# 集合注入

# 数组

<property name="array">
    <array>
        <value>100</value>
        <value>200</value>
        <value>300</value>
    </array>
</property>
1
2
3
4
5
6
7

# List

<property name="list">
    <list>
        <value>itcast</value>
        <value>itheima</value>
        <value>boxuegu</value>
        <value>chuanzhihui</value>
    </list>
</property>
1
2
3
4
5
6
7
8

# Set

<property name="set">
    <set>
        <value>itcast</value>
        <value>itheima</value>
        <value>boxuegu</value>
        <value>boxuegu</value>
    </set>
</property>
1
2
3
4
5
6
7
8

# Map

<property name="map">
    <map>
        <entry key="country" value="china"/>
        <entry key="province" value="henan"/>
        <entry key="city" value="kaifeng"/>
    </map>
</property>
1
2
3
4
5
6
7

# Properties

<property name="properties">
    <props>
        <prop key="country">china</prop>
        <prop key="province">henan</prop>
        <prop key="city">kaifeng</prop>
    </props>
</property>
1
2
3
4
5
6
7
编辑 (opens new window)
上次更新: 2023/02/07, 14:51:48
外部资源
Spring基础02

← 外部资源 Spring基础02→

Theme by Vdoing | Copyright © 2021-2023 yuadh
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×