2022年Spring全家桶Spring5.x 框架详解
Posted ly甲烷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022年Spring全家桶Spring5.x 框架详解相关的知识,希望对你有一定的参考价值。
本文是在看了b站视频【尚硅谷Spring框架视频教程(spring5源码级讲解)】后,手动实现及理解整理
视频地址:https://www.bilibili.com/video/BV1Vf4y127N5?spm_id_from=333.999.0.0
Spring框架概述
Spring是轻量级开源JavaEE框架,可以解决企业应用开发的困难性。
有两个核心部分:
- IOC:控制反转, 把创建对象的过程交给Spring去管理
- AOP: 面向切面编程,不修改源码进行功能增强。
Spring 特点:
- 方便解耦、简化开发
- AOP编程支持
- 方便程序测试
- 方便和其他框架整合
- 方便进行事务操作
- 降低API开发难度
Spring 模块
入门案例
1.导入IOC核心jar包
2.创建对象类
public class Book
private String bName;
private String bAuthor;
public void testDemo()
System.out.println(bName + "::" + bAuthor);
3.创建bean1.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="book" class="cn.lych4.spring5.bean.Book"></bean>
</beans>
4.创建对象
//1. 加载spring 配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
//2.获取配置的对象
Book book = context.getBean("book", Book.class);
System.out.println(book);
book.testDemo();
IOC
什么是IOC?
控制反转(IOC), 就算把对象创建和对象之间的调用过程交给Spring容器进行管理
IOC的目的是为了降低耦合
IOC过程
第一步: xml配置文件,配置创建的对象
<bean id="userDao" class="cn.lych4.dao.impl.UserDaoImpl"></bean>
第二步: 有service 类 和 dao 类, 创建工厂类。进一步降低耦合度
class UserFactory
public static UserDao getDao()
String classValue = class属性值; // 1. XML解析
Class clazz = Class.forName(classValue) // 通过反射创建对象
return (UserDao)clazz.newInstance();
IOC接口
IOC 思想基于IOC容器完成,IOC容器底层就算对象工厂
Spring 提供两种方式实现 IOC 容器: (两个接口)
- BeanFactory: IOC容器基本实现,是Spring 内部的使用接口,一般开发人员不使用
加载配置文件的时候,不会创建对象,在获取对象的时候才去创建对象 - ApplicationContext: 是BeanFactory的子接口,提供更多强大的功能,一般由开发人员使用。
加载配置文件的时候,就会把对象创建
IOC的bean管理
什么是Bean管理
Bean管理指的是两个操作:
- Spring 创建对象
- Spring 注入属性(set值)
Bean管理操作有两种方式
①. 基于XML配置文件方式实现, ②.基于注解方式实现
IOC的Bean管理操作(基于xml)
1.bean标签创建对象
在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以是实现对象创建
*id属性: 对象标识
*class属性: 类全路径
name属性:早期属性,和id类似,只不过可以加特殊符号
默认执行无参构造完成对象创建
DI 依赖注入,注入属性
——set注入
对象类必须有对应set方法
配置文件:
<bean id="book" class="cn.lych4.spring5.bean.Book">
<!-- set方法注入属性 -->
<property name="bName" value="易筋经"></property>
<property name="bAuthor" value="达摩老祖"></property>
</bean>
——有参构造注入
对象类必须有对应有参构造方法
配置文件:
<!-- 有参构造创建对象-->
<bean id="orders" class="cn.lych4.spring5.bean.Orders">
<constructor-arg name="oname" value="电脑"></constructor-arg>
<constructor-arg name="address" value="China"></constructor-arg>
</bean>
xml注入其他类型属性,空值和bean值
1.字面量
null 空值
<!--注入空值-->
<property name="bAuthor">
<null/>
</property>
属性值包括特殊符号
特殊符号转义,或者是把特殊内容写到 <![CDATA[这里]]
<!--注入带特殊符号的值, <[大神]> -->
<property name="bAuthor">
<value><![CDATA[<[大神]>]]></value>
</property>
2.注入属性-外部bean
创建一个Service类和Dao类
在Service类中调用Dao类中的方法
在spring配置文件中进行配置
<!-- 1.service 和 dao 对象创建-->
<bean id="userService" class="cn.lych4.spring5.service.UserService">
<!-- 2.service 中注入 userDao 对象, name:类里面的属性名称-->
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="cn.lych4.spring5.dao.UserDaoImpl"></bean>
3.注入属性-内部bean
(1)一对多关系:部门和员工
(2)在实体类中表示一对多的关系
//部门类,一
public class Dept
private String name;
public void setName(String name)
this.name = name;
//员工类,多
public class Emp
private String ename;
private String gender;
//员工属于某一个部分
private Dept dept;
public void setEname(String ename)
this.ename = ename;
public void setGender(String gender)
this.gender = gender;
public void setDept(Dept dept)
this.dept = dept;
(3)在spring配置文件中进行配置
<!-- 注入内部bean-->
<bean id="emp" class="cn.lych4.spring5.bean.Emp">
<property name="ename" value="lucy"></property>
<property name="gender" value="女"></property>
<!-- 设置对象类型属性-->
<property name="dept">
<bean id="dept" class="cn.lych4.spring5.bean.Dept">
<property name="name" value="安保部"></property>
</bean>
</property>
</bean>
3.注入属性-级联赋值
(1) 第一种
<!-- 注入内部bean-->
<bean id="emp" class="cn.lych4.spring5.bean.Emp">
<property name="ename" value="lucy"></property>
<property name="gender" value="女"></property>
<!-- 级联赋值-->
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="cn.lych4.spring5.bean.Dept">
<property name="dname" value="财务部"></property>
</bean>
(2)第二种
<!-- 注入内部bean-->
<bean id="emp" class="cn.lych4.spring5.bean.Emp">
<property name="ename" value="lucy"></property>
<property name="gender" value="女"></property>
<!-- 级联赋值-->
<property name="dept" ref="dept"></property>
<!-- 这里Emp类必须有dept属性的get方法-->
<property name="dept.dname" value="技术部"></property>
</bean>
<bean id="dept" class="cn.lych4.spring5.bean.Dept">
<property name="dname" value="财务部"></property>
</bean>
xml注入集合属性
注入数组、List、Map
<bean id="stu" class="cn.lych4.spring5.collectiontype.Stu">
<!-- 数组类型注入-->
<property name="courses">
<array>
<value>java课程</value>
<value>数据库课程</value>
</array>
</property>
<!-- list类型注入-->
<property name="list">
<list>
<value>张三</value>
<value>三哥</value>
</list>
</property>
<!-- map类型属性注入-->
<property name="maps">
<map>
<entry key="爱好" value="学习"></entry>
</map>
</property>
<!-- set类型属性注入-->
<property name="sets">
<set>
<value>Java</value>
<value>mysql</value>
</set>
</property>
</bean>
设置对象集合
<bean id="stu" class="cn.lych4.spring5.collectiontype.Stu">
<!-- list类型,里面是对象,属性注入-->
<property name="courseList">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
<ref bean="course3"></ref>
</list>
</property>
</bean>
<!-- 创建多个course对象-->
<bean id="course1" class="cn.lych4.spring5.collectiontype.Course" >
<property name="cname" value="Java"></property>
</bean>
<bean id="course2" class="cn.lych4.spring5.collectiontype.Course" >
<property name="cname" value="Python"></property>
</bean>
<bean id="course3" class="cn.lych4.spring5.collectiontype.Course" >
<property name="cname" value="Go"></property>
</bean>
抽取集合值, 引入util命名空间
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<util:list id="bookList" >
<value>MySQL必知必会</value>
<value>JVM调优</value>
</util:list>
<bean id="book" class="cn.lych4.spring5.collectiontype.Book" >
<property name="bnames" ref="bookList"></property>
</bean>
</beans>
2. FactoryBean
Spring有两种类型的bean,一种是普通的bean 另外一种是工厂bean (FactoryBean)
- 普通bean: 在配置文件种定义bean类型就是返回类型
- 工厂bean:在配置文件定义bean类型可以和返回类型不一样
第一步:创建类,让这个类作为工厂bean, 实现接口FactoryBean
第二步:实现接口里面的方法,在实现的方法中定义返回的bean类型
创建一个Bean,实现FactoryBean接口
public class MyBean implements FactoryBean<Course>
//定义返回bean
public Course getObject() throws Exception
Course course = new Course();
course.setCname("abc");
return course;
public Class<?> getObjectType()
return null;
public boolean isSingleton()
return false;
xml配置文件
<bean id="myBean" class="cn.lych4.spring5.factorybean.MyBean">以上是关于2022年Spring全家桶Spring5.x 框架详解的主要内容,如果未能解决你的问题,请参考以下文章
2022年苹果WWDC定于6月开办,全家桶软件系统均计划升级
2021年大厂面试题汇总:JVM+Redis+多线程+Spring全家桶