📃个人主页: 不断前进的皮卡丘
🌞博客描述: 梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记
🔥网站推荐:千里之行,始于足下。每天坚持刷题,巩固所学知识,也为将来找工作,面试做好准备----- 刷题神器
文章是看楠哥的视频写的笔记
这篇博客内容把Spring的基本知识点都讲到了,篇幅比较长,大家可以用于复习,也可以在学习相关知识点的时候,来看看对应内容。对于一些难点,IOC,AOP等,我通过流程图,代码,文字结合来进行讲解,可以更好的理解
Spring FrameWork
一、 前言
- Spring是当前Java开发的行业标准,第一框架
- Spring FrameWork已经从最初取代EJB的框架逐步发展成一套完整的生态,最新的版本是5.x
- Spring架构体系图
- Spring两大核心机制:
- IOC:工厂模式
- AOP:代理模式
二、IOC(控制反转)
2.1 对于IOC的理解
传统开发中,需要调用对象的时候,需要调用者手动来创建被调用者的实例,即对象是由调用者new出来的
但是在Spring框架中,创建对象的工作不再由调用者来完成,而是交给IOC容器来创建,再推送给调用者,整个流程完成反转,所以是控制反转
就比如说假设买东西,以前我们需要自己去超市买东西,但是现在我们可以不用自己去超市,我们只要把购物袋放在家门口,IOC就会自己去把我们想要的东西买回来,然后放在袋子里面,我们打开袋子拿起来用就可以了
IOC的特点是解耦合。
比如说A需要用到B,传统的开发,我们要直接创建B的实例,但是在Spring中,IOC这个容器会创建B的实例,然后把这个B注入到A
2.2如何使用IOC
- 创建maven工程,在pom.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>org.example</groupId>
<artifactId>springioc</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
</dependencies>
</project>
- 创建实体类Student
public class Student {
private long id;
private String name;
private int age;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
- 在resources路径下创建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 id="stu" class="com.zyh.pojo.Student"></bean>
</beans>
- 传统的开发方式:手动new Student
Student stu =new Student();
stu .setAge(25);
stu.setId(1001);
stu.setName("张三");
System.out.println(stu);
- IOC容器通过读取配置文件,加载配置
bean
标签来创建对象 - 就像买菜一样,我们不需要自己亲自买,但是要写一张单子,告诉说要买什么,程序也是类似的,我们要告诉Spring框架要创建哪些对象,怎样创建对象
- 调用API,从IOC获取对象
//读取配置文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Student stu = applicationContext.getBean("stu", Student.class);
System.out.println(stu);
2.3配置文件的解读
- 通过配置
bean
标签来完成对象的管理 id
:对象名class
:对象的模板类(所有交给IOC容器来管理的类必须要有无参构造函数,因为Spring底层是通过反射机制来创建对象,调用的是无参构造)- 对象的成员变量通过
property
标签完成赋值name
:成员变量名value
:成员变量值(基本数据类型,String可以直接赋值,如果是其他引用类型不可以通过value赋值)ref
:把IOC中的另一个bean赋给当前成员变量(DI)
2.4IOC容器创建bean的两种方式
-
无参构造函数(需要提供对应的set方法)
-
-
有参构造函数
<bean id="stu1" class="com.zyh.pojo.Student">
<constructor-arg name="id" value="1"> </constructor-arg>
<constructor-arg name="name" value="李四"></constructor-arg>
</bean>
<bean id="stu1" class="com.zyh.pojo.Student">
<constructor-arg index=0 value="1"> </constructor-arg>
<constructor-arg index=1 value="李四"></constructor-arg>
</bean>
2.5从IOC容器中取bean
- 通过id取值
Student stu = (Student)applicationContext.getBean("stu");
- 通过类型取值
Student stu = applicationContext.getBean( Student.class);
- 当IOC容器中存在两个以上Student Bean的时候就会抛出异常,因为此时没有唯一的bean
2.6bean的属性如果包含特殊字符
三、DI(依赖注入)
- DI:指bean之间的依赖注入,设置对象之间的级联关系
- Classes
public class Classes {
private Integer id;
private String name;
还有对应的get,set方法
}
- Student
public class Student {
private long id;
private String name;
private int age;
private Classes classes;
public Student(){
System.out.println("使用无参构造创建对象");
}
public Student(long id,String name){
this.id = id;
this.name = name;
}
public Classes getClasses() {
return classes;
}
public void setClasses(Classes classes) {
this.classes = classes;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this