课程内容
- Spring框架概述
- IOC容器
- AOP
- JdbcTemplate
- 事务管理
- Spring5新特性
Spring框架描述
-
Spring是轻量级开源的JavaEE框架
-
Spring可以解决企业开发的复杂性
-
Spring有两个核心部分:IOC和AOP
- IOC:控制反转,把创建对象的过程交给Spring进行管理
- AOP:面向切面,不修改源代码进行功能增强
-
Spring特点
- 方便解耦,简化开发
- Aop编程支持
- 方便程序测试
- 方便和其他框架进行整合
- 方便进行事务操作
- 降低API开发难度
-
现在使用的是Spring5
入门案例
- 下载Spring
<img src="
2. 打开Idea,创建普通Java工程
- 导入Spring5相关的jar包
- 创建普通类,在这个类创建普通方法
public class User {
public void add() {
System.out.println("add.....");
}
}
- 创建Spring配置文件,在配置文件配置创建的对象
-
Spring的配置文件使用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"> <!--配置User对象创建--> <bean id="user" class="com.atguigu.spring5.User"></bean> </beans>
- 进行测试代码编写
@Test
public void testAdd() {
//1 加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
//2 获取配置创建的对象
User user = context.getBean("user", User.class);
System.out.println(user);
user.add();
}
IOC容器
IOC底层原理
-
什么是IOC
- 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理
- 使用IOC目的:降低耦合度
- 入门案例就是IOC实现
-
xml解析、工厂模式、反射
-
IOC过程
- xml配置文件,配置创建的对象
- 有Service类和Dao类,创建工厂类
-
IOC接口(BeanFactory)
- IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
- Spring提供了IOC容器实现的两种方式:(两个接口)
- BeanFactory:IOC容器基本实现,是Spring内部使用接口,不提供开发人员进行使用
- 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
- ApplicationContext:BeaFactory接口的子接口,提供更多更强大的功能,一般由开发人员使用
- 加载配置文件时候就会把在配置文件对象进行创建
- BeanFactory:IOC容器基本实现,是Spring内部使用接口,不提供开发人员进行使用
- ApplicationContext实现类
-
什么是Bean管理
- Spring创建对象
- Spring注入属性
Bean管理操作—基于xml
1. 基于xml配置文件实现
-
基于xml方式创建对象
xml<bean id="user" class="com.atguigu.spring5.User"></bean>
- 在Spring配置文件中,使用
bean
标签,标签里面添加对应属性,就可以实现 对象创建 - 在bean标签中有很多属性,介绍常用属性
- id属性:唯一标识
- class属性:类的全路径(包类+路径)
- 创建对象时,默认也是执行无参数构造方法完成对象
- 在Spring配置文件中,使用
-
基于xml注入属性
-
DI:依赖注入,就是注入属性
-
第一种注入方式,
set()
方法进行注入<bean id="book" class="com.atguigu.spring5.Book"> <!-- 使用property完成属性注入 name:类里面属性名称 value:向属性注入的值 --> <property name="bname" value="易筋经"></property> <property name="bauthor" value="达摩"></property> </bean>
-
第二种注入方式,使用有参数的构造进行注入
-
创建类,定义属性,创建属性对应有参数构造方法
-
在Spring配置文件中配置
<!-- 有参构造注入属性 --> <bean id="orders" class="com.atguigu.spring5.Orders"> <constructor-arg name="oname" value="电脑"> </constructor-arg> <constructor-arg name="address" value="中国"></constructor-arg> </bean>
-
p名称空间注入(做了解)
- 使用p名称空间注入,可以简化基于xml配置的
set()
方法输入,使用时需要有set()
方法 - 第一步:添加p名称空间在配置文件中
xmlns:p="http://www.springframework.org/schema/p"
- 第二步:进行属性注入
<bean id="book" class="com.atguigu.spring5.Book" p:bname="九阳神功" p:bauthor="无名氏"> </bean>
- 使用p名称空间注入,可以简化基于xml配置的
-
-
xml注入其他类型属性
-
null值
<!--null值--> <property name="address"> <null/> </property>
-
属性值包含特殊符号
<!-- 属性值包含特殊符号 1. 把<>进行转译 <> 2. 把带特殊符号的内容写到CDATA --> <property name="address"> <value><![CDATA[<<南京>>]]></value> </property>
-
-
-
注入属性----外部bean(使用ref属性)
-
创建两个类service类和dao类
-
在service调用dao里面的方法
-
在Spring配置文件中进行配置
<!-- 1.service和dao对象创建 --> <bean id="usrService" class="com.atguigu.spring5.service.UserService"> <!-- 注入UserDao对象 name属性值,类里面属性名称 ref属性:创建userDao对象bean标签id值 --> <property name="userDao" ref="userDaoImpl"></property> </bean> <bean id="userDaoImpl" class="com.atguigu.spring5.dao.UserDaoImpl"></bean>
-
-
注入属性----内部bean和级联赋值
-
一对多的关系:部门和员工
- 一个部门有多个员工,一个员工属于一个部门
- 部门是一,员工是多
-
在实体类之间表示一对多关系,员工表示所属部门,使用对象类型进行表示
-
在Spring配置文件中进行配置
<!-- 内部bean --> <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>
-
注入属性----级联赋值
<bean id="emp" class="com.atguigu.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="com.atguigu.spring5.bean.Dept"> <property name="dname" value="财务部"></property> </bean>
或者
<bean id="emp" class="com.atguigu.spring5.bean.Emp"> <!-- 设置两个普通属性 --> <property name="ename" value="lucy"></property> <property name="gender" value="女"></property> <!-- 级联赋值 --> <property name="dept" ref="dept"></property> <property name="dept.dname" value="技术部"></property> </bean> <bean id="dept" class="com.atguigu.spring5.bean.Dept"> <property name="dname" value="财务部"></property> </bean>
-
-
xml注入集合属性
-
注入数组
-
注入List集合属性
-
注入Map集合
<!--集合类型属性注入--> <bean id="stu" class="com.atguigu.spring5.coolectiontype.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="JAVA" value="java"></entry> <entry key="PHP" value="php"></entry> </map> </property> <!-- set类型注入 --> <property name="sets"> <set> <value>MySQL</value> <value>Redis</value> </set> </property> </bean>
-
在集合里面设置对象类型值
<!--集合类型属性注入--> <bean id="stu" class="com.atguigu.spring5.coolectiontype.Stu"> <!-- 注入list集合类型,值是对象 --> <property name="courseList"> <list> <ref bean="course1"></ref> <ref bean="course2"></ref> </list> </property> </bean> <!-- 创建多个Course对象 --> <bean id="course1" class="com.atguigu.spring5.coolectiontype.Course"> <property name="cname" value="Spring5框架课程"></property> </bean
-
-