一,Spring的简介和安装,深入理解IOC容器及测试

1) IOC/DI (IOC容器)

2) AOP面向切面编程

3) 声明式事务

官网地址:spring 是一家公司-商业化运作。apache 是一家基金会组织,接收社会的捐赠。

https://spring.io/

io表示开发者平台

一,Spring的简介和安装,深入理解IOC容器及测试

一,Spring的简介和安装,深入理解IOC容器及测试
  1. Spring F ramework

Spring 基础框架,可以视为 Spring 基础设施,基本上任何其他Spring 项目都是以Spring Framework 为基础的。

Spring5 ,基于jdk1.8 。

1.1 Spring F ramework 的优良特性

1 非侵入式:使用 Spring Framework 开发应用程序时,Spring 对应用程序本身的结构影响非常小。对领域模型(Java Bean)可以做到零污染;对功能性组件也只需要使用几个简单的注解进行标记,完全不会破坏原有结构,反而能将组件结构进一步简化。这就使得基于 Spring Framework 开发应用程序时结构清晰、简洁优雅。

2 控制反转:IOC——Inversion of Control,翻转资源获取方向。把自己创建资源、向环境索取资源变成环境将资源准备好,我们享受资源注入。

3 面向切面编程:AOP——Aspect Oriented Programming,在不修改源代码的基础上增强代码功能。

4 容器:Spring IOC 是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化的管理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发效率。

5 组件化:Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用 XML 和 Java 注解组合这些对象。这使得我们可以基于一个个功能明确、边界清晰的组件有条不紊的搭建超大型复杂应用系统。

6 声明式:很多以前需要编写代码才能实现的功能,现在只需要声明需求即可由框架代为实现。

7 一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。而且 Spring 旗下的项目已经覆盖了广泛领域,很多方面的功能性需求可以在 Spring Framework 的基础上全部使用 Spring 来实现。

1.2 Spring Framework 五大功能模块

一,Spring的简介和安装,深入理解IOC容器及测试
  1. IOC容器的概念

2 .1 生活中的普通容器

一,Spring的简介和安装,深入理解IOC容器及测试

普通容器只能用来存储,没有更多功能。

2 .2 程序中的普通容器

变量,数组,集合

普通容器只能用来存储,没有更多功能。

2 .3 生活中的复杂容器

一,Spring的简介和安装,深入理解IOC容器及测试

政府管理我们的一生,生老病死都和政府有关。

4 . IOC 容器在Spring 中的实现

Spring 的IOC 容器就是IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做bean 。在创建 bean 之前,首先需要创建IOC 容器。Spring 提供了IOC 容器的两种实现方式:

①BeanFactory

这是 IOC 容器的基本实现,是Spring 内部使用的接口。面向Spring 本身,不提供给开发人员使用。

②ApplicationContex — 我们自己使用

BeanFactory 的子接口,提供了更多高级特性。面向Spring 的使用者,几乎所有场合都使用ApplicationContext 而不是底层的BeanFactory 。

所以,以后在 Spring 环境下看到一个类或接口的名称中包含ApplicationContext ,那基本就可以断定,这个类或接口与IOC 容器有关。

③ApplicationContext 的主要实现类

一,Spring的简介和安装,深入理解IOC容器及测试

一,Spring的简介和安装,深入理解IOC容器及测试

5 . 基于X ML 管理bean

5 .1 实验0 1 [重要 ] 创建bean ,并根据id 获取

5 .1.1 目标

由 Spring 的IOC 容器创建类的对象,并根据bean 的id 属性值来获取bean 对象。

5 .1.2 思路

一,Spring的简介和安装,深入理解IOC容器及测试

自定义一个类IE mpS ervice => EmpS erviceI mpl,这个类在Spring 的配置文件中进行配置,然后用ClassP athXMLA pplicationC ontext 这个类去读取配置文件,然后根据配置文件中配置的东西,将这个对象建立出来。

5 .1.3 创建maven 项目,导入依赖

完整的pom 文件

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”>

1.8

导入一个依赖,传递过来剩下的jar 文件

一,Spring的简介和安装,深入理解IOC容器及测试

一,Spring的简介和安装,深入理解IOC容器及测试

一,Spring的简介和安装,深入理解IOC容器及测试

5 . 1.4 EmpService -> EmpServiceImpl

package com.hy.service.impl;

import com.hy.service.EmpService;

public class EmpServiceImpl implements EmpService {

@Override

public void reg() {

System. out.println(“用户注册”);

}

}

1) 先导入spring 的相关环境,其实就是导入pom 文件jar 包的坐标gav 。

2) 创建spring 的配置文件applicationContext.xml

一,Spring的简介和安装,深入理解IOC容器及测试

“1.0” encoding= “UTF-8”?>

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 没有属性,所以可以写成单标签

5 .1.5 创建测试类

public class TestService {

// ApplicationContext 就是我们的IOC 容器

private ApplicationContext iocContainer = new ClassPathXmlApplicationContext(“applicationContext.xml”);

//实验01 [重要]创建bean

//从IOC 容器中获取已配置的bean

@Test

public void testEmpService() {

//通过bean 的id 属性的值得,获取这个bean 对象

EmpService empService = (EmpService)iocContainer.getBean(“empService”);

empService.reg();

}

}

注意:Spring 底层默认通过反射技术调用类的无参构造方法来创建类的对象。

5 . 1.6 无参构造方法的重要性,写一个有参的构造方法,测试

package com.hy.service.impl;

import com.hy.service.EmpService;

public class EmpServiceImpl implements EmpService {

public EmpServiceImpl(int age) {

}

@Override

public void reg() {

System. out.println(“用户注册”);

}

}

报错: 如果没有无参构造方法,则会抛出下面的异常:

一,Spring的简介和安装,深入理解IOC容器及测试

一,Spring的简介和安装,深入理解IOC容器及测试

所以对一个JavaBean 来说,无参构造器和属性的getXxx()、setXxx()方法是必须存在的,特别是在框架中。

一,Spring的简介和安装,深入理解IOC容器及测试

5 .1.7 用IOC 容器创建对象和自己建区别

一,Spring的简介和安装,深入理解IOC容器及测试

被放入到容器当中,相当于加入了会员俱乐部

在Spring 环境下能够享受到的所有福利,都必须通过IOC 容器附加到组件类上,所以随着我们在Spring 中学习的功能越来越多,IOC 容器创建的组件类的对象就会比自己new 的对象 其功能强大的越来越多。

5 .2 实验0 2 [重要 ] 创建bean ,并根据 class类型来获取

5.2.1 指定类型的bean 唯一(只有一个 )

一,Spring的简介和安装,深入理解IOC容器及测试

5.2.2 测试

package com.hy.test;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.hy.service.EmpService;

import com.hy.service.impl.EmpServiceImpl;

public class TestService2 {

// ApplicationContext 就是我们的IOC 容器

private ApplicationContext iocContainer = new ClassPathXmlApplicationContext(“applicationContext.xml”);

//实验02 [重要]创建bean ,并且根据类型获取bean 对象

//从IOC 容器中根据类型获取已配置的bean 对象

@Test

public void testEmpService() {

// EmpService empService = iocContainer.getBean(EmpService.class); //正确

EmpService empService = iocContainer.getBean(EmpServiceImpl. class); //正确

empService.reg(); //用户注册

}

}

一,Spring的简介和安装,深入理解IOC容器及测试

5 .2.3 问题:如果配置了两个同样类型的bean 对象,则报错,根据类型获取报错。

“1.0” encoding= “UTF-8”?>

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”>

package com.hy.test;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.hy.service.EmpService;

import com.hy.service.impl.EmpServiceImpl;

public class TestService2 {

// ApplicationContext 就是我们的IOC 容器

private ApplicationContext iocContainer = new ClassPathXmlApplicationContext(“applicationContext.xml”);

//实验02 [重要]创建bean ,并且根据类型获取bean 对象

//如果容器中配置了同样类型的两个bean 对象,

//从IOC 容器中根据类型获取已配置的bean 对象时,则报错。

@Test

public void testEmpService() {

// EmpService empService = iocContainer.getBean(EmpService.class); //失败

EmpService empService = iocContainer.getBean(EmpServiceImpl. class); //失败

}

}

一,Spring的简介和安装,深入理解IOC容器及测试

一,Spring的简介和安装,深入理解IOC容器及测试

5 .2.4 总结

如果一个类实现了某个接口,根据接口类型可以获取 bean 吗?

可以,前提是bean 唯一,如下的配置就不行。

如果一个接口有多个实现类,这些实现类都配置了 bean 标签,根据接口类型可以获取 bean 吗?

不行,因为bean 不唯一

根据类型来获取bean 时,在满足bean 唯一性的前提下,其实只是看:『对象 instanceof 指定的类型』的返回结果,只要返回的是true 就可以认定为和类型匹配,能够获取到。

5 .3 实验0 3 [重要 ] 给bean 的属性赋值: 通过setX xx 方法注入

5 .3.1 首先,给Emp S ervice Impl 添加一个属性,提供set X xx 和get X xx 方法

package com.hy.service.impl;

import com.hy.service.EmpService;

public class EmpServiceImpl implements EmpService {

private String empStatus;

public String getEmpStatus() {

return empStatus;

}

public void setEmpStatus(String empStatus) {

this.empStatus = empStatus;

}

@Override

public void reg() {

System. out.println(“用户注册”);

}

}

5 .3.2 在配置时给通过property 标签给属性赋值

一,Spring的简介和安装,深入理解IOC容器及测试

5.3.3 测试

package com.hy.test;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.hy.service.impl.EmpServiceImpl;

public class TestService3 {

private ApplicationContext iocContainer = new ClassPathXmlApplicationContext(“applicationContext.xml”);

//实验03 [重要]

@Test

public void testEmpService() {

//通过bean 的id 属性的值得,获取这个bean 对象

EmpServiceImpl empService3 = (EmpServiceImpl)iocContainer.getBean(“empService3”);

System. out.println(empService3.getEmpStatus()); //积极

}

}

5 .4 实验04 [重要] 引入外部已声明的bean

5 .5 内部bean[重要]

5 .6 引入外部属性文件[重要 ]

5 .7 给bean 的属性赋值:级联属性赋值 (不重要,不怎么使用)

使用内部bean ,给级联属性赋值。

5 .8 通过构造方法,给bean 属性赋值[不重要 ]

5 .9 给bean 的集合属性赋值[不重要 ]

private List

private Map

张三2

李四2

王五2

5.10 自动装配 与 手动装配[了解 ]

所谓自动装配就是一个组件需要其他组件时,由 IOC 容器负责找到那个需要的组件,并装配进去。

@Test

public void testExperiment12() {

HappyController happyController = iocContainer.getBean(HappyController.class);

HappyService happyService = happyController.getHappyService();

System.out.println(“happyService = ” + happyService);

}

5.11 bean 的声明周期以及初始化

在无参构造方法打一个断点。

bean 标签scope 配置singleton 时,bean 的创建是在IOC 容器初始化的时候,创建的,而不是在getB ean 的时候创建的。

bean 标签scope 配置prototype 时,bean 的创建实在调用getB ean 方法的时候创建的。

一,Spring的简介和安装,深入理解IOC容器及测试

IOC 容器关闭之前销毁bean 对象。

一,Spring的简介和安装,深入理解IOC容器及测试

一,Spring的简介和安装,深入理解IOC容器及测试

一,Spring的简介和安装,深入理解IOC容器及测试

一,Spring的简介和安装,深入理解IOC容器及测试

一,Spring的简介和安装,深入理解IOC容器及测试

6 ,基于注解管理bean

和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作。

本质上:所有一切的操作都是Java 代码来完成的,XML 和注解只是告诉框架中的Java 代码如何执行。

一,Spring的简介和安装,深入理解IOC容器及测试

一,Spring的简介和安装,深入理解IOC容器及测试

1) 首先根据所需要的组件类型到IOC 容器中查找

能够找到唯一的bean :直接执行装配

如果完全找不到匹配这个类型的bean :装配失败

和所需类型匹配的bean 不止一个

没有@Qualifier 注解:根据@Autowired 标记位置成员变量的变量名作为bean 的id 进行匹配

能够找到:执行装配

找不到:装配失败

使用@Qualifier 注解:根据@Qualifier 注解中指定的名称作为bean 的id 进行匹配

能够找到:执行装配

找不到:装配失败

Original: https://www.cnblogs.com/lijili/p/16668322.html
Author: 雾里看瓜
Title: 一,Spring的简介和安装,深入理解IOC容器及测试

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622689/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • springboot源码分析——SPI扩展机制

    springboot最重要的特性就是自动配置,许多功能不需要手动开启,会自动帮助程序员开启,如果想扩展某些 第三方组件的功能,例如mybatis,只需要配置依赖,就可以了,这其中都…

    Java 2023年5月30日
    087
  • Vue

    Vue 学习目标 前端知识体系 HTML(页面的结构)、CSS(表现层)、JavaScript(行为) HTML 就不说了。 CSS CSS层叠样式是一门标记语言,并不是编程语言,…

    Java 2023年6月5日
    089
  • SpringBoot整合JDBC

    SpringBoot整合JDBC 1、新建一个 jdbccontroller.java @RestController public class JDBCController { …

    Java 2023年6月7日
    068
  • 关于 base64 编码

    一、什么是Base64编码 Base64是一种用64个字符来表示任意二进制数据的方法。它是一种编码方式,而非加密方式。它通过将二进制数据转变为64个”可打印字符&#82…

    Java 2023年6月7日
    072
  • Spring Boot PDF文件转图片

    spring boot 里的 pdf 转 图片 开发环境: java 8 spring boot 2.x 前后端分离 需求:先从FTP文件服务器里获取PDF文件,再把PDF文件转换…

    Java 2023年6月5日
    077
  • 归并排序求解逆序对

    cpp;gutter:true;</p> <h1>include</h1> <h1>include</h1> <h…

    Java 2023年6月5日
    076
  • SpringCloud学习笔记-Eureka基础

    Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的微服…

    Java 2023年5月30日
    089
  • Apache Druid数据查询套件详解计数、排名和分位数计算(送JSON-over-HTTP和SQL两种查询详解)

    5. 数据查询 欲看此文,必看如下两篇文章: Druid支持JSON-over-HTTP和SQL两种查询方式。除了标准的SQL操作外,Druid还支持大量的唯一性操作,利用Drui…

    Java 2023年6月15日
    080
  • 2022-8-18 第六组 JDBC

    JDBC 1. 概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库 JDBC本质:其实是官方(sun公司)定义的一套操作所有…

    Java 2023年6月13日
    045
  • 数据库的多表查询

    我们知道,增删查改这几种操作在开发过程中不可或缺,下面重点介绍的是查询操作 在数据库中,80%的操作是通过查询完成的.在实际开发中能中,不可能只会用到一张表,多表查询在查询中起很大…

    Java 2023年6月8日
    087
  • 从零开始实现放置游戏(十二)——实现战斗挂机(3)数据字典和缓存改造

    上一章,我们添加了游戏的主界面和注册登录功能。由于距离上上篇间隔较长,可能有些内容想些的后来就忘了。同时,逻辑也不复杂,所以描述比较粗略。 现在随着模块的增加,整个架构也暴露出一些…

    Java 2023年6月5日
    064
  • Java动态脚本Groovy读取配置文件

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 核心涉及: @Value:作用是通过注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值…

    Java 2023年6月5日
    079
  • 【Nacos】Param ‘serviceName’ is illegal, serviceName is blank

    java.lang.IllegalArgumentException: Param ‘serviceName’ is illegal, serviceName is blank a…

    Java 2023年6月15日
    092
  • Java对象创建过程

    基本概念 一般情况下,JVM的对象都放在堆内存中(发生逃逸分析除外)。当类加载检查通过后,Java虚拟机开始为新生对象分配内存。如果Java堆中内存是绝对规整的,所有被使用过的的内…

    Java 2023年5月29日
    061
  • 自建Gitlab迁移工具使用指南

    说明迁移工具包于 2022 年 04 月 13 日 进行更新,新增自建 Gitlab 人员权限关系和已开启的合并请求迁移能力, 建议该日期前下载工具的用户更新最新版本使用。 注意建…

    Java 2023年6月8日
    075
  • 【校招VIP】[前端][二本][6分]简历一线校招通过率较低

    关注【校招VIP】 公众号,回复【简历】 ,添加校招顾问微信,即可获取简历指导! 本份简历是一位21届一本前端同学的简历,简历评分6分。 一、学员简历 二、指导意见 简历版式问题不…

    Java 2023年6月5日
    097
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球