Spring
1.本章主要内容
1.1.Spring框架概要
1.2.IOC容器 (***)
1.3.AOP (***)
1.4.jdbcTemplate
1.5.事务管理 (***)
1.6.Spring5新特性
1.7.Spring整合Mybatis (*)
2.Spring概要
概述:它是轻量级的开源的JavaEE框架
-
轻量级:它的体积小,依赖的jar包比较少,并且不需要额外依赖其他的组件
-
开源:免费提供源代码
-
框架:可以简化我们构建软件的过程
目的:为了解决企业级应用的复杂性
核心:
-
IOC:控制反转-把创建对象的过程交给Spring进行管理
-
AOP:面向切面编程-不修改源码进行功能增强
优点:
- 方便解耦,简化开发
- 对AOP编程的支持
- 方便程序的测试
- 方便整合其他各种的框架
- 方便进行事务操作
- 降低API开发
3.入门案例
3.1.入门案例1
-
先再pojo里创建User实体类
package com.wdzl.pojo; public class User { public void showInfo(){ System.out.println("我是User的对象"); } }
-
再在resource中创建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.wdzl.pojo.User"></bean> </beans>
-
最后在test里进行测试
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserTest { @Test public void test(){ //1.加载Spring配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //2.通过获取User对象 User user = context.getBean("user",User.class); user.showInfo(); } }
-
-
3.2.入门案例2
1.创建图书类
public class Book {
private String name;
private String author;
}
2.创建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">
<!-- 创建book对象 -->
<!-- <bean id="book" class="com.wdzl.pojo.Book">-->
<!-- <property name="name" value="Java从入门到入土"></property>-->
<!-- <property name="author" value="布莱恩特"></property>-->
<!-- </bean>-->
<bean id="book" class="com.wdzl.pojo.Book">
<!-- <constructor-arg name="name" value="Java葵花宝典"></constructor-arg>-->
<!-- <constructor-arg name="author" value="昭通"></constructor-arg>-->
<constructor-arg index="0" value="Java葵花宝典"></constructor-arg>
<constructor-arg index="1" value="昭通"></constructor-arg>
</bean>
</beans>
3.test
import com.wdzl.pojo.Book;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BookTest {
@Test
public void test(){
//1.加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("beans2.xml");
//2.获取对象
Book book = context.getBean("book", Book.class);
System.out.println(book);
}
}
4.IOC容器
概述
- 控制反转
- 综上所述:控制反转就是把创建对象,和对象间的调用的过程交给Spring来管理。目的是为了降低类与类之间的耦合性
4.1底层原理
- XML解析
- 工厂模式
- 反射
4.2原理图解
4.3几个重要的概念
1.IOC容器:IOC的实现,依赖于IOC容器,而IOC容器的本质就是对象工厂
2.IOC容器的实现
BeanFactory:是最底层的接口,他只提供了最简单的容器功能:加载配置文件 和 创建对象
- 当加载配置文件时,不会创建被配置的对象,只有在使用时,对象才会创建
- 好处:节省内存
- 坏处:因为在服务器运行的时候去创建对象,会影响执行效率
- ApplicationContext:应用上下文,他是继承了BeanFactory,它是Spring更高级的一个容器接口,它提供了更多有用的功能
- 当加载配置文件的时候,会同时创建被配置的 对象
- 好处:效率高,将复杂的创建过程在服务器启动时完成
- 坏处:耗费资源
- 当加载配置文件的时候,会同时创建被配置的 对象
3.ApplicationContext的三个实现类
查看:选中ApplicationContext —》按Ctrl 点击 —》右上角download source(如果有)-----》Ctrl H—》即可查看继承体系结构
-
ClassPathXmlApplicationContext:从项目中的Sources文件中加载配置文件你
- FileSystemXmlApplicationContext:从文件系统读取配置文件(需要访问权限)
- AnnotationConfigApplicationContext:读取注解配置
5.IOC操作-Bean管理
概念:IOC 操作-Bean管理是指两个操作:1.Spring创建对象 2.Spring注入属性(属性赋值)
实现方式
1.XML方式
2.注解方式
5.1.基于XML方式—创建对象
该方式与入门案例方式相同
bean标签的常用属性
- id:唯一标识,通过该属性可以找到对应的Bean标签
- class:类的全限定类名
注意事项
创建对象时,默认执行无参构造方法来完成对象的创建(反射)
5.2.基于XML—注入属性(属性赋值)
DI:依赖注入,它是IOC的一个具体操作
分类
1.使用set方法进行注入
2.使用构造器 进行注入
演示
属性注入通过
- name:实体类属性名
- value:属性类
<bean id="book" class="com.wdzl.pojo.Book">
<!--使用set方法进行注入-->
<!-- <property name="name" value="Java从入门到入土"></property>-->
<!-- <property name="author" value="赵童"></property>-->
<!-- </bean>-->
<!--使用构造器-name进行注入-->
<!-- <constructor-arg name="name" value="java宝典"></constructor-arg>-->
<!-- <constructor-arg name="author" value="赵童"></constructor-arg>-->
<!--使用构造器-index进行注入-->
<constructor-arg index="0" value="java宝典"></constructor-arg>
<constructor-arg index="1" value="赵童"></constructor-arg>
</bean>
5.2.1.构造方法注入
构造方法注入通过
<!--使用构造器-index进行注入-->
<constructor-arg index="0" value="java宝典"></constructor-arg>
<constructor-arg index="1" value="赵童"></constructor-arg>
5.2.2.P空间命名注入
1.引入约束
xmlns:p="http://www.springframework.org/schema/p"
2.标签
<bean id="book" class="com.wdzl.pojo.Book" p:name = "Java入门宝典" p:author="昭通">
</bean>
5.2.3.特殊符号注入
<bean id="book" class="com.wdzl.pojo.Book">
<property name="name">
<null></null>
</property>
<property name="author">
<!-- <value>"<赵童<“</value>-->
<value><![CDATA[<赵童>]]</value>
</property>
</bean>
1.null
2.使用转义字符
2-2.CDATA
5.2.6.外部bean
1.新建Module,添加相关依赖
2.按照三层架构创建:Dao,Service,Web,在Service层中添加对Dao的依赖(dao成员变量,对应的set方法)
3.配置相关信息
5.2.5.内部bean
在属性标签内部创建bean
1.在上一个演示案例的基础上,创建两个实体类Emp和Dept,其中Emp包含一个Dept对象属性
2.配置对象信息
里面 name=”dept“ 是属性, id=”dept“是创建的对象名,两者无需一致。
5.2.6.级联操作
给两个对象的属性同时赋值
方式1:
<!--级联操作 1.保证ref与第一个bean id 一致-->
<bean id="dept" class="com.wdzl.pojo.Dept">
<property name="deptName" value="研发部"></property>
</bean>
<bean id="emp" class="com.wdzl.pojo.Emp">
<!--注入属性-基本数据-->
<property name="name" value="周杰伦"></property>
<property name="gender" value="男"></property>
<!--引用数据类型-->
<property name="dept" ref="dept">
</property>
</bean>
</beans>
方式2:
<!-- 2.把属性移到引用数据类型下,name变成dept.deptName-->
<bean id="dept" class="com.wdzl.pojo.Dept">
</bean>
<bean id="emp" class="com.wdzl.pojo.Emp">
<!--注入属性-基本数据-->
<property name="name" value="周杰伦"></property>
<property name="gender" value="男"></property>
<!--引用数据类型-->
<property name="dept" ref="dept">
</property>
<property name="dept.deptName" value="运营部"></property>
</bean>
</beans>
注意事项
针对方式2:一定要提供get、set方法,否则配置文件中的某些属性就会报红。
5.2.7.数组、集合方式的注入
<bean id="demo" class="com.wdzl.pojo.Demo">
<!--字符串数组-->
<property name="strings">
<array>
<value>你好</value>
<value>Hello</value>
</array>
</property>
<!--List集合-->
<property name="list"