Java阶段二Day13
文章目录
今天开始是学习后端框架SSM(Spring、SpringMVC、MyBatis)
网站
- 前端:页面的展示(美丽的外表)
- 后端:功能的展示(实际的业务)
Spring
-
本质来讲是一种生态,一个家族,其下有许多子框架(SpringFramework、SpringBoot、SpringCloud…)基于项目的复杂度、不同功能的要求拆分不同的子框架,每个框架都有独特的作用。
-
如:
- SpringFramework:整个Spring家族里面的,最核心的、偏底层的工程(本质上SSM中第一个S说的是 SpringFramework)
- SpringBoot:可以快速搭建项目的集成环境、解决依赖关系
-
注意:SpringMVC是 SpringFramework的子工程
-
具体详情可参考官方文档:Spring官方文档
SpringFramework
Spring
指的是Spring Framework
,通常我们称之为Spring框架。Spring框架是一个分层的面向切面的Java应用程序的一站式解决框架,它是Spring技术栈的核心和基础,是为了解决企业级引用开发的复杂性而创建的。
核心模块
- IoC:Inverse of Control的简写,为 控制反转,指把创建对象交给Spring进行管理。
- AOP:
Aspect Oriented Programming
的简写,为 面向切面编程。AOP用来封装多个类的公共行为,将那些与业务无关,却为业务模块共同调用的逻辑封装起来,减少系统的重复代码,降低模块间的耦合度。另外,AOP还解决一些系统层面上的问题,比如日志、事务、权限等。
特点
- 控制反转:IoC,反转资源获取方向;把自己创建的资源、向环境索取资源变为环境将资源准备好,我们享受资源注入。
- 面向切面编程:AOP,在不修改源代码的基础上增强代码功能。
- 容器:Spring IoC是一个容器,因为它包含并管理组件对象的生命周期;组件享受到了容器化的管理,替程序员屏蔽了组件创建过程中的大量细节,极大降低了使用门槛,大幅度提高了开发效率。
- 一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方库,而且在Spring旗下的项目已经覆盖了广泛领域,很多方面的功能性需求可以在Spring Framework 的基础上全部使用Spring来实现。
使用Spring创建项目
-
在pom.xml中,引入spring相关依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.24</version> </dependency>
-
创建类,创建属性和方法
package com.liner.spring.begin; public class User { private String username; // 无参构造 public User(){ System.out.println("0:无参构造执行了~~~"); } public void add(){ System.out.println("HelloWorld"); } }
-
在
resources
中,通过xml配置文件,告知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 id="user" class="com.liner.spring.begin.User"></bean> </beans>
-
进行测试
package com.liner.spring.begin; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserTest { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { /** 方式1:通过spring创建 java bean 对象 1.加载spring配置文件(bean.xml) 2.获取spring创建好的对象 3.打印测试(调add方法) */ ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); User user = (User) context.getBean("user"); System.out.println("user = " + user); user.add(); /** 方式2:new方式创建java对象 */ User user2 = new User(); System.out.println("user2 = " + user2); user2.add(); //spring的底层是通过反射的方式 /** 方式3:反射方式创建java对象 1.获取class对象 2.调用方法进行创建 */ Class zz = Class.forName("com.liner.spring.begin.User"); User user3 = (User) zz.newInstance(); System.out.println("user3 = " + user3); user3.add(); } }
对象存储
存放到容器中,查看源码,DefaultListableBeanFactory.java,第164行,可以查看 BeanDefinition 的源码,有类的描述信息,是否初始化的状态等等
- key:唯一标识
- value:类的定义(描述信息)
创建对象的方式
- new方式创建
- 反射方式创建
- 交给spring来创建
IoC容器
- IoC 是
Inversion of Control
的简写,译为 控制反转。 - Spring通过IoC容器来管理所有的Java对象的实例化和初始化,控制着对象与对象之间的依赖关系。我们将由IoC容器管理的Java对象成为 Spring Bean,它与使用关键字 new 创建的Java对象没有任何区别。
- IoC容器是Spring框架中最重要的核心组件之一,它贯穿了Spring从诞生到成长的整个过程
控制反转
- 控制反转是一种思想
- 将对象的创建权利交出去,交给第三方容器负责
- 将对象和对象之间的关系维护权交出去,交给第三方容器负责
- 通过依赖注入 DI 的方式实现
依赖注入
- DI (Dependency Injection):依赖注入,依赖注入实现了控制反转的思想,是指Spring创建对象的过程中,将对象依赖属性通过配置进行注入
- 依赖注入常见的实现方式有两种:set注入 和 构造器注入
- 所以 IoC 是一种控制反转的思想,而 DI 是对IoC的一种具体实现。
IoC容器的实现
-
BeanFactory
:这是IoC容器的基本实现,是Spring内部使用的接口。面向Spring本身,不提供给开发人员使用。 -
ApplicationContext
:BeanFactory
的子接口,提供了更多高级特性,面向Spring的使用者,几乎所有场合都使用ApplicationContext
,而不是底层的BeanFactory
-
ApplicationContext的主要实现类:
类型 说明 ClassPathXmlApplicationContext 通过读取类路径下的xml格式配置文件创建IoC容器对象 FileSystemApplicationContext 通过文件系统路径读取xml格式配置文件创建IoC容器对象
基于XML管理bean
获取bean方式
- 通过id获取:context.getBean(“id属性值”)
- 通过类型获取:context.getBean(类名.class)
- 通过id和类型获取:context.getBean(“id属性值”, 类名.class) 【为了精准常用此方法获取bean】
注意:当根据类型获取bean时,要求IoC容器中指定类型的bean只能有一个,当配置两个时会抛出异常:NoUniqueBeanDefinitionException
: expected single matching bean but found 2: studentImp1,studentImp2
xml配置文件中的标签
-
bean
标签,主要是创建java bean对象<bean id = "xxx" class = "xxx.xxx.xxx"></bean>
-
property
标签,通过set方法注入属性值<property name = "" value = ""></property>
-
constructor-arg
标签,通过构造器注入属性值<constructor-arg name = "" value = ""></constructor-arg>
特殊值处理注入
-
字面量赋值:
<!-- 使用value属性给bean的属性赋值时,spring会把value的属性值看作是字面量 --> <property name="number" value="1016"></property>
-
null值:
<null></null>
-
xml实体:
< > 在XML文档中具有特殊含义,在注入属性值时不能够随便使用,用XML实体
<
,>
来代替<constructor-arg name="description" value="<真好看啊电影>"></constructor-arg>
-
CDATA区:
CDATA区,是xml中一种特有的写法,在CDATA区中可以包含特殊符号表示方式:
<![CDATA[内容]]>
,在内容区域可以存放普通字符和特殊符号<constructor-arg name="description"> <!-- CDATA区存放数据,可通过 CD + Tab键自动补全格式 --> <value><![CDATA[<真好看啊>]]></value> </constructor-arg>