Spring全面详解(学习总结)
Posted 不断前进的皮卡丘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring全面详解(学习总结)相关的知识,希望对你有一定的参考价值。
- Spring FrameWork
- 一、 前言
- 二、IOC(控制反转)
- 三、DI(依赖注入)
- 四、Spring中的bean
- 五、Spring中的继承
- 六、Spring的依赖
- 七、Spring读取外部资源
- 八、Spring的p命名空间
- 九、Spring工厂方法
- 十、Spring IOC 自动装配 autowire
- 十一、Spring AOP
文章是看楠哥的视频写的笔记
这篇博客内容把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.age = age;
@Override
public String toString()
return "Student" +
"id=" + id +
", name='" + name + '\\'' +
", age=" + age +
", classes=" + classes +
'';
applicationContext-di.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="classes" class="com.zyh.pojo.Classes">
<property name="name" value="1班"></property>
<property name="id" value="1"></property>
</bean>
<bean id="student" class="com.zyh.pojo.Student">
<property name="id" value="1001"></property>
<property name="name" value="张三"></property>
<property name="age" value="22"></property>
<property name="classes" ref="classes"></property>
</bean>
</beans>
bean之间的级联需要使用ref属性,而不能用value属性,否则会抛出类型转换异常
<?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="classes" class="com.zyh.pojo.Classes">
<property name="name" value="1班"></property>
<property name="id" value="1"></property>
<property name="studentList">
<list>
<ref bean="student"></ref>
<ref bean="student2"></ref>
</list>
</property>
</bean>
<bean id="student" class="com.zyh.pojo.Student">
<property name="id" value="100"></property>
<property name="name" value="张三"></property>
<property name="age" value="22"></property>
<property name="classes" ref="classes"></property>
</bean>
<bean id="student2" class="com.zyh.pojo.Student">
<property name="id" value="200"></property>
<property name="age" value="18"></property>
<property name="name" value="李四"></property>
<property name="classes" ref="classes"></property>
</bean>
</beans>
如果把学生装到班级里面,又把班级装到学生里面,就导致无限递归循环装配,最终栈溢出
四、Spring中的bean
bean是根据scope来生成的,表示bean的作用域,scope有4种类型
-
singleton,单例,表示通过Spring容器获取的对象是唯一的,是默认值
-
prototype,原型,表示通过Spring容器获取的对象是不同的
- 配置文件
<bean id="user" class="com.zyh.pojo.User" scope="prototype">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
</bean>
- request,请求,表示在异常HTTP请求内有效
- session,会话,表示在一个用户会话内有效
request和session一般用于web项目
singleton模式下,只要加载IOC容器,不管是否从IOC种取出bean,配置文件中的bean都会被创建,而且只会创建一个对象
prototype模式下,如果不从IOC中取出bean,则不创建对象,取一次bean,就会创建一个对象
五、Spring中的继承
Spring中的继承不同于Java中的继承
Java中的继承是针对于类的
Spring中的继承是针对于对象(bean)
<?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="user1" class="com.zyh.pojo.User" >
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
以上是关于Spring全面详解(学习总结)的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud 与微服务学习总结(18)—— Spring Cloud Gateway 2.0 详解
Spring Cloud 与微服务学习总结(18)—— Spring Cloud Gateway 2.0 详解
ECMAScript6新特性数组扩展(扩展运算符新增方法一新增方法二新增方法三)-全面详解(学习总结---从入门到深化)