Spring基础01
# Spring框架
Spring
是 javaEE
必备技能
- 简化开发 (
IOC\DI
、AOP
) - 框架整合 (
事务处理
)
Spring
框架架构
Spring
学习
- 核心容器:核心概念(
IOC/DI
) 、容器的基本操作 AOP
:核心概念、AOP
基础操作、AOP
实用开发- 事务:事务使用开发
- 整合:整合数据层技术
MyBatis
- 全家桶:
SpringMVC
、SpringBoot
# 核心容器
# 核心概念
传统 javaweb
开发三层业务层耦合度高
为了解决这类问题,在程序中不主动使用 new
产生对象,转换为由外部提供对象,这就是 Spring
容器的核心概念
IOC
:使用对象时,由主动 new
产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部——此思想称为 控制反转
对 IOC
思想得实现:
提供一个容器,称之为 IOC
容器,该容器负责对象的创建、初始化的等一些列工作,被创建或管理的对象在 IOC
容器中成为 Bean
DI
: 依赖注入,在容器创立 bean
与 bean
之间的依赖关系的整个过程,称之为依赖注入
实现的最终效果
使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系
# Bean实现
控制反转,将对象创建的方式交给Bean实现
- meavn导入Spring
<dependencies>
<!--导入spring的坐标spring-context,对应版本是5.2.10.RELEASE-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
2
3
4
5
6
7
8
- 定义基础类
DAO层
public interface BookDao {
public void save();
}
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
}
2
3
4
5
6
7
8
9
Service层
public interface BookService {
public void save();
}
public class BookServiceImpl implements BookService {
private BookDao bookDao = new BookDaoImpl();
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
2
3
4
5
6
7
8
9
10
11
- 创建
Spring
的配置文件
定义 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标签:表示配置bean
id属性:表示给bean起名字
class属性:表示给bean定义类型
-->
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"></bean>
</beans>
2
3
4
5
6
7
8
9
10
11
12
13
- 在
main
文件中初始化IOC
容器,获取Bean
对象
public class App {
public static void main(String[] args) {
//1.创建IoC容器对象,加载spring核心配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//2 从IOC容器中获取Bean对象(BookService对象)
BookService bookService= (BookService)ctx.getBean("bookService");
//3 调用Bean对象(BookService对象)的方法
bookService.save();
}
}
2
3
4
5
6
7
8
9
10
# DI实现
依赖注入,将对象属性设置用Spring实现
- 删除
Service
层对DAO
层对象的new
对象方式
public class BookServiceImpl implements BookService {
private BookDao bookDao; //【第一步】删除使用new的形式创建对象的代码
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
2
3
4
5
6
7
- 提供依赖对象对应的 setter 方法
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
//【第二步】提供依赖对象对应的setter方法
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
2
3
4
5
6
7
8
9
10
11
- 设置
spring
配置文件
<?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标签:表示配置bean
id属性:表示给bean起名字
class属性:表示给bean定义类型
-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<!--配置server与dao的关系
property标签:表示配置当前bean的属性
name属性:表示配置哪一个具体的属性
ref属性:表示参照哪一个bean
-->
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 额外扩展
# 别名
Bean
可以起多个别名,使用 , ; space
分割
<bean id="bookDao" name="book4 bookX" class="com.yuadh.DAO.impl.BookDaoImpl"></bean>
使用
ctx.getBean('book4')
# 作用范围
scope
属性可以通知,bean
的创建次数
singleton
默认,创建单例prototype
非单例
扩展:scope的取值不仅仅只有singleton和prototype,还有request、session、application、 websocket ,表示创建出的对象放置在web容器(tomcat)对应的位置。比如:request表示保存到request域中。
BookService bookService = (BookService) ctx.getBean("bookService");
BookService bookService = (BookService) ctx.getBean("bookService");
2
如果两次打印的结果地址值不一致,说明是非单例模式,但是一般都是使用单例模式
# Bean实例化
Bean实例化有多种方法
# 构造方法
如上快速入门
public class AppForInstanceBook {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
}
}
2
3
4
5
6
7
8
9
# 静态工厂方法
工厂类
public class BookDaoImplFatory {
public static BookDao getBookDI() {
System.out.println("producte loading...");
return new BookDaoImpl();
}
}
2
3
4
5
6
配置文件
<bean id="bookDao" class="com.yuadh.DAO.Fatory.BookDaoImplFatory" factory-method="getBookDI"></bean>
测试类
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
# 实例工厂方法
工厂类
public class BookDaoImplFatory {
public BookDao getBookDI() {
System.out.println("producte loading...");
return new BookDaoImpl();
}
}
2
3
4
5
6
配置文件
<bean id="bookFactory" class="com.yuadh.DAO.Fatory.BookDaoImplFatory"/>
<bean id="bookDao" factory-method="getBookDI" factory-bean="bookFactory"/>
2
测试类
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
2
# Bean生命周期
# 手动绑定
public class BookDaoImpl implements BookDao {
@Override
public void save() {
System.out.println("book dao save...");
}
public void init(){
System.out.println("Bean init...");
}
public void destory(){
System.out.println("Bean destory");
}
}
2
3
4
5
6
7
8
9
10
11
12
配置文件
<bean id="bookDao1" class="com.yuadh.DAO.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
绑定了Bean
初始化和销毁时的绑定函数
# 实现接口
public class BookDaoImpl implements BookDao , InitializingBean, DisposableBean {
@Override
public void save() {
System.out.println("book dao save...");
}
@Override
public void destroy() throws Exception {
}
@Override
public void afterPropertiesSet() throws Exception {
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 摧毁时机
手动关闭
ConfigurableApplicationContext
接口close()
操作
关闭钩子
ConfigurableApplicationContext
接口registerShutdownHook()
操作
//注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
ctx.registerShutdownHook();
2
# DI依赖注入
DI依赖注入有多多种方式
- setter 简单类型
- 构造器 简单类型、引用类型
# setter注入
给Bean实例对象类设置 set
方法,在配置文件中设置 property
public class BookServiceImpl implements BookService {
private BookDao bookDao;
@Override
public void save() {
System.out.println("book server loading...");
}
public void setBookDao(BookDaoImpl bookDao) {
this.bookDao = bookDao;
}
}
2
3
4
5
6
7
8
9
10
11
配置文件
<bean id="bookService" class="com.yuadh.Service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao1"></property>
</bean>
2
3
简单类型注入
<bean id="bookService" class="com.yuadh.Service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao1"></property>
<property name="count" value="10"></property>
</bean>
2
3
4
# 构造器注入
在Bean类中定义构造方法,配置文件使用 constructor-arg
标签
public class BookServiceImpl implements BookService {
private BookDao bookDao;
private int count=0;
public BookServiceImpl(BookDao bookDao) {
this.bookDao = bookDao;
}
}
2
3
4
5
6
7
8
配置文件
<bean id="bookService" class="com.yuadh.Service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"></constructor-arg>
</bean>
<bean id="bookDao" class="com.yuadh.DAO.impl.BookDaoImpl"/>
2
3
4
简单类型和setter注入一致
<constructor-arg name="count" value="10" />
constructor-arg
属性的参数配置
type
属性 指定类型index
属性 指定参数位置注入
# 自动装配
自动装配,自动注入依赖
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
<bean id="bookDao" class="com.yuadh.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.yuadh.service.impl.BookServiceImpl" autowire="byType"/>
2
- 不能对简单类型进行操作
- 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
- 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
- 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
# 集合注入
# 数组
<property name="array">
<array>
<value>100</value>
<value>200</value>
<value>300</value>
</array>
</property>
2
3
4
5
6
7
# List
<property name="list">
<list>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
<value>chuanzhihui</value>
</list>
</property>
2
3
4
5
6
7
8
# Set
<property name="set">
<set>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
<value>boxuegu</value>
</set>
</property>
2
3
4
5
6
7
8
# Map
<property name="map">
<map>
<entry key="country" value="china"/>
<entry key="province" value="henan"/>
<entry key="city" value="kaifeng"/>
</map>
</property>
2
3
4
5
6
7
# Properties
<property name="properties">
<props>
<prop key="country">china</prop>
<prop key="province">henan</prop>
<prop key="city">kaifeng</prop>
</props>
</property>
2
3
4
5
6
7