Spring5复习笔记
时间:2023-06-16 11:07:01
0. Spring架构
1. 内容介绍
- Spring 框架概述
- IOC容器
- IOC底层原理
- IOC接口(BeanFactory)
- IOC操作Bean管理(基于xml)
- IOC操作Bean管理(基于注释)
- AOP
- JdbcTemplete
- 事务管理(声明事务)
- Spring5新特性
2. Spring 框架概述
- Spring是
轻量级
的开源的
JavaEE框架 - Spring可以解决企业发展的复杂性
- Spring有两个核心部分:IOC和AOP
IOC
:控制反转,将给创建对象的过程Spring进行管理Aop
:面向切面,功能增强不修改代码
- Spring 特点
- 便于解耦,简化开发
- IOC控制反转解耦对象之间的耦合
- Aop编程支持
- 方便程序测试
- 集成的Junit,方便对程序进行单元测试
- 与其他框架集成方便
- 事务操作方便
- 简化了声明事务的操作
- 降低API开发难度
- 便于解耦,简化开发
3. Spring 入门案例
3.1 下载Spring5
- 使用Spring 最新稳定版5.2.6
- 下载地址
3.2 打开idea工具,创建java工程
3.3 导入Spring5相关基本jar包
3.4 在这一类创造普通的方法
public class User {
public void add() {
System.out.println("add..."); } }
3.5 创建Spring配置文件,配置文件创建对象
- Spring 使用配置文件xml格式
bean1
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="user" class="com.atguigu.spring5.User">bean> beans>
3.6 进行测试代码编写
package com.atguigu.spring5.testdemo;
import com.atguigu.spring5.Book;
import com.atguigu.spring5.Orders;
import com.atguigu.spring5.User;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring5 {
@Test
public void testAdd() {
//1 加载spring配置文件
BeanFactory context =
new ClassPathXmlApplicationContext("bean1.xml");
//2 获取配置创建的对象
User user = context.getBean("user", User.class);
System.out.println(user);
user.add();
}
}
测试结果
4. IOC容器
4.1 IOC(概念和原理)
4.1.1 什么是IOC?
- 控制反转,把对象创建和对象之间的调用过程交给Spring进行管理
- 使用IOC的目的:为了降低耦合度
- 做入门案例就是IOC实现
4.1.2 IOC底层原理
xml解析
- 使用xml解析解析xml配置文件中的配置信息
工厂模式
- 使用工厂来创建对象
反射
- 工厂中实际创建对象的方式,利用反射的Class.forName()方法创建对象
4.1.3 画图讲解IOC底层原理
4.2 IOC(BeanFactory接口)
- IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
- Spring提供IOC容器实现两种方式:(两个接口)
BeanFactory
:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用- 加载配置文件时候不会创建对象,在获取对象(使用)时才会去创建对象
ApplicationContext
: BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用- 加载配置文件时就会把在配置文件对象进行创建-让对象在程序启动时创建,这样只会使程序启动时间较长,如果在获取对象(使用)时才会去创建对象,此时会使用户的等待时间变长不利于交互
- ApplicationContext接口有有实现类
4.3 IOC操作Bean管理
4.3.1 概念
4.3.1.1 什么是Bean管理?
- Bean管理值的是两个操作
- Spring创建对象
- Spring属性注入
4.3.1.2 Bean管理操作有两种方式
- 基于xml配置文件方式实现
- 基于注解方式实现
4.3.2 IOC操作Bean管理(基于xml方式)
4.3.2.1 基于xml方式创建对象
<bean id="user" class="com.atguigu.spring5.User">bean>
-
在Spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
-
在bean标签有很多,介绍常用的属性
- id属性: 唯一标识,一般使用类名首字母小写命名
- class属性: 类的全路径,该属性值用于反射时创建对象
-
创建对象时,默认也是执行无参构造方法完成对象创建
4.3.2.2 基于xml方式注入属性DI
- DI:依赖注入,也就是属性注入
4.3.2.3 注入方式一-使用set方法进行注入
-
创建类,定义属性和属性对应的set方法
package com.atguigu.spring5; /** * 演示使用set方法进行注入属性 */ public class Book { //创建属性 private String bname; private String bauthor; //创建属性对应的set方法 public void setBname(String bname) { this.bname = bname; } public void setBauthor(String bauthor) { this.bauthor = bauthor; } /打印属性-用于测试属性是否注入成功 public void testDemo() { System.out.println(bname+"::"+bauthor); } }
-
在spring配置文件配置对象创建,配置属性注入
<bean id="book" class="com.atguigu.spring5.Book"> <property name="bname" value="易筋经">property> <property name="bauthor" value="达摩老祖">property> bean>
-
测试代码及结果
@Test public void testBook1() { //1 加载spring配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); //2 获取配置创建的对象 Book book = context.getBean("book", Book.class); System.out.println(book); book.testDemo(); }
4.3.2.4 注入方式二-使用有参构造进行注入
-
创建类,定义属性,创建属性对应的有参构造方法
package com.atguigu.spring5; /** * 使用有参数构造注入 */ public class Orders { //属性 private String oname=""; private String address; //有参数构造 public Orders(String oname,String address) { this.oname = oname; this.address = address; } //打印属性-用于测试属性是否注入成功 public void ordersTest() { System.out.println(oname+"::"+address); } }
-
在spring配置文件中进行配置
<bean id="orders" class="com.atguigu.spring5.Orders"> <constructor-arg name="oname" value="电脑">constructor-arg> <constructor-arg name="address" value="China">constructor-arg> bean>
-
测试代码及结果
@Test public void testOrders() { //1 加载spring配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); //2 获取配置创建的对象 Orders orders = context.getBean("orders", Orders.class); System.out.println(orders); orders.ordersTest(); }
4.3.2.5 p名称空间注入(了解)
名称空间注入本质上还是set方法注入,只是在xml配置中简化了写法
-
使用p名称空间注入,可以简化基于xml配置方式
-
第一步: 添加p名称空间在配置文件中
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
-
第二步: 进行属性注入,在bean标签里进行操作
<bean id="book" class="com.atguigu.spring5.Book" p:bname="九阳神功" p:bauthor="无名氏"> bean>
-
测试代码及结果
@Test public void testBook1() { //1 加载spring配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); //2 获取配置创建的对象 Book book = context.getBean("book", Book.class); System.out.println(book); book.testDemo(); }
-
4.3.2.6 xml注入其他类型属性
4.3.2.6.1 字面量
4.3.2.6.1.1 null值
<property name="address">
<null/>
property>
4.3.2.6.1.2 属性值包含特殊符号
<property name="address">
<value>>]]>value>
property>
4.3.2.6.2 注入属性-外部bean
- 创建两个类service类和dao类
- 在service调用dao里面的方法
- 在spring配置文件中进行配置
UserDao
package com.atguigu.spring5.dao;
public interface UserDao {
public void update();
}
UserDaoImpl
package com.atguigu.spring5.dao;
public class UserDaoImpl implements UserDao {
@Override
public void update() {
System.out.println("dao update...........");
}
}
UserService
package com.atguigu.spring5.service;
import com.atguigu.spring5.dao.UserDao;
import com.atguigu.spring5.dao.UserDaoImpl;
public class UserService {
//创建UserDao类型属性,生成set方法
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add() {
System.out.println("service add...............");
userDao.update();
}
}
配置文件
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userService" class="com.atguigu.spring5.service.UserService">
<property name="userDao" ref="userDaoImpl">property>
bean>
<bean id="userDaoImpl" class="com.atguigu.spring5.dao.UserDaoImpl">bean>
beans>
测试类及结果
@Test
public void testBean1() {
//1 加载spring配置文件
ApplicationContext context =
new ClassPathXmlApplicationContext("bean2.xml");
//2 获取配置创建的对象
UserService userService = context.getBean("userService", UserService.class);
userService.add();
}
4.3.2.6.3 注入属性-内部bean
- 一对多关系:部门和员工
- 一个部门有多个员工,一个员工属于一个部门部门是一,员工是多
- 在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示
Dept
package com.atguigu.spring5.bean;
//部门类
public class Dept {
private String dname;
public void setDname(String dname) {
this.dname = dname;
}
@Override
public String toString() {
return "Dept{" +
"dname='" + dname + '\'' +
'}';
}
}
Emp
package com.atguigu.spring5.bean;
import java.util.Arrays;
//员工类
public class Emp {
private String ename;
private String gender;
//员工属于某一个部门,使用对象形式表示
private Dept dept;
//生成dept的get方法
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public void setEname(String ename) {
this.ename = ename;
}
public void setGender(String gender) {
this.gender = gender;
}
public void add() {
System.out.println(ename+"::"+gender+"::"+dept);
}
}
配置文件
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="emp" class="com.atguigu.spring5.bean.Emp">
<property name="ename" value="lucy">property>
<property name="gender" value="女">property>
<property name="dept">
<bean id="dept" class="com.atguigu.spring5.bean.Dept">
<property name="dname" value="安保部">property>
bean>
property>
bean>
beans>
测试类及结果
@Test public