Spring(一)
2019-12-09 本文已影响0人
So_ProbuING
Spring
Spring概述
- Spring是与2003年兴起的一个full-stack轻量级的Java开源框架。
- Spring以IOC(控制反转)和AOP(面向切面编程)为核心
- Spring提供了展现层SpringMVC、持久层SpringJDBC、业务层事务管理等众多企业级应用技术
- Spring还能整合开源世界众多的第三方框架和类库
Spring优势
- 方便解耦、简化开发
- AOP编程支持
- 声明式事务支持
- 方便程序的测试
- 方便集成各种优秀的框架
- 降低JavaEE API的使用难度
- 开源源代码
Spring的体系结构
Spring的体系结构IOC
IOC(控制反转)是一种设计思想
- 控制:指的是控制权,在Java中可以简单理解为对象的控制权限(比如对象的创建、销毁等权限)
- 反转:指的是将对象的控制权由原来的程序员在类中主动控制反转到由Spring容器来控制
Spring入门
导入坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
创建dao接口和实现类
public interface IUserDao {
void save();
}
public class UserDaoImplv2 implements IUserDao {
public void save() {
}
}
加入配置文件
- 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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
</beans>
测试
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
</beans>
Spring的IOC容器工作原理
- 当Spring的IOC容器加载时,会读取配置文件中的诸多bean
- 根据bean的class的值寻找对应的Class字节码文件
- 通过反射技术,创建出一个个对象
- 创建的对象会被存放到内部的一个Map结构中,等待被使用
- 当需要使用具体的对象时无须自己创建,直接从Spring的IOC容器中取
Spring的API介绍
- BeanFactory
- BeanFactory是Spring的心脏
- BeanFactory是IOC容器的核心接口,它定义了IOC的节本功能
- Spring使用它来配置文档,管理bean的加载,实例化并维护bean之间的依赖关系,负责bean的生命周期
- ApplicationContext
- ApplicationContext由BeanFactory派生而来,可以理解为Spring的躯体
- ApplicationContext由BeanFactory的基础上添加了很多功能
- 支持了aop功能和web应用
- MessageSource,国际化的消息访问
- 通过配置来实现BeanFactory中很多编码才能实现的功能
- ApplicationContext的常用实现类
- ClassPathXmlApplicationContext:从classpath目录读取配置文件
- FileSystemXmlApplicaitonContext:从文件系统或者url中读取配置文件
- AnnotationConfigApplicationContext:当我们使用注解配置容器对象时,需要使用此类来创建Spring容器。它用来读取注解
- 两者的区别
- beanFactory主要是面向Spring框架的基础设施,也就提供spring自身内部调用。而ApplicationContext主要面向Spring的使用者
- BeanFactory在第一次使用到某个Bean时(调用getBean())才对该Bean进行加载实例化,而ApplicationContext是在容器启动时,一次性创建并加载了所有的Bean
创建Bean对象的不同方式
默认无参构造函数
会根据默认无参构造函数来创建类对象,如果bean中没有默认无参构造函数,将会创建失败
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
工厂模式创建对象
在Spring中还可以通过工厂模式来创建对象
工厂模式又分两种:
静态工厂:先不生产工厂的实例,直接调用工厂的静态方法
实例工厂:先产生工厂的实例,再调用工厂实例的方法创建对象
- 工厂类
public class FactoryCreateBean{
//静态
public static UserDao createUserDao(){
return new UserDaoImpl();
}
public UserDao createUserDaoSimple(){
return new UserDaoImpl();
}
}
<bean id="userDao1" class="com.itheima.factory.FactoryCreateBean" factory-method="createUserDao"/>
<!--使用实例工厂创建对象-->
<bean id="factoryCreateBean" class="com.itheima.factory.FactoryCreateBean"/>
<bean id="userDao2" factory-bean="factoryCreateBean" factory-method=“createUserDaoSimple”/>
Bean对象的作用域
所谓Bean的作用域其实就是指Spring给我们创建出的对象的存活范围
可以在spring配置文件中通过bean标签中的scope属性来对当前bean对象的作用域进行指定
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" scope="prototype"/>
- scope属性有五个取值:
- Singleton(默认) 创建出的实例为单例模式,IOC只创建一次,然后一直存在
- Prototype 创建出的实例为多例模式,每次获取bean的时候,IOC都给我们重新创建新对象
- request(web) web项目中,Spring创建一个Bean的对象,将对象存入到request中
- session(web) web项目中,Spring创建一个Bean的对象,将对象存入到session域中
- globalSession 创建的实例绑定全局session对象
依赖注入
依赖注入:Dependency Injection 是spring框架核心ioc的具体实现
通过构造函数注入
public Book(String name,Float price,Date publishDate){
this.name = name;
this.price = pricae;
this.publishDate = publicshDate;
}
<bean id= "date" class="java.util.Data"/>
<bean id="book" class="com.itheima.spring.book">
<!--
index:指定参数在构造函数参数列表的索引位置,从0开始
name:指定参数在构造函数中的名称
type:指定参数在构造函数中的数据类型,可以通过反射拿到,不需要关系
value:它能赋的值是基本数据类型和String类型
ref:它能赋的值是其他bean类型,也就是说,必须得是在配置文件中配置过的bean
-->
<constructor-arg name="name" value="sd"/>
<constructor-arg name="price" value="1"/>
<constructor-arg name="publishDate" ref="date"/>
</bean>
通过setter属性注入
<bean id="book" class="com.itheima.spring.book">
<!--
name:类中set方法后面的部分
ref:给属性赋值是其他bean类型
value:给属性赋值是基本数据类型和String类型的
-->
<property name="name" value="xdsa"/>
<property name="price" value="1"/>
<property name="publishDate" ref="date"/>
</bean>
注入集合属性
注入集合也是用的set方法注入,只不过变量的数据类型都是集合
<bean id="book" class="com.itheima.spring.Book">
<!--List-->
<property name="list">
<list>
<value>1</value>
<value>2</value>
</list>
</property>
<!--Set-->
<property name="set">
<set>
<value>3</value>
<value>4</value>
</set>
</property>
<!--数组-->
<property name="array">
<array>
<value>5</value>
<value>6</value>
</array>
</property>
<!--Map-->
<property name="map">
<map>
<entry key="7" value="7-1" />八、Bean对象的生命周期
所谓的Bean对象生命周期其实指的是Bean创建到销毁的这么一段时间。
8.1 粗粒度生命周期验证
在Spring中可以通过配置的形式,指定bean在创建后和销毁前要调用的方法。
经测试得知:
spring中单例对象的生命周期为:
出生:IOC容器加载时出生
存活:IOC容器运行时存活
死亡:IOC容器销毁时死亡
spring中多例对象的生命周期为:
出生:使用对象时出生
存活:一直存活
死亡:由java垃圾回收器负责销毁
8.2 细粒度生命周期验证
出生过程
1. 实例化bean对象【IOC】
2. 为对象属性赋值【DI】
3. 处理实现的Aware接口
① 如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,
此 处传递的就是Spring配置文件中Bean的id值。
<entry key="8" value="8-1" />
</map>
</property>
<!--Properties-->
<property name="properties">
<props>
<prop key="9">9-1</prop>
<prop key="10">10-1</prop>
</props>
</property>
</bean>
Bean对象的生命周期
粗粒度生命周期验证
在Spring中可以通过配置的形式,指定bean在创建后和销毁前要调用的方法
<bean id="userDao" class="xxx" scope="prototype"
init-method="init" destroy-method="destroy"/>
- spring中单例对象的生命周期为:
- 出生:IOC容器加载时出生
- 存活:IOC容器运行时存活
- 死亡:IOC容器销毁时死亡
- spring中多例对象的生命周期为
- 出生:使用对象时出生
- 存活:一直存活
- 死亡:由java垃圾回收器负责销毁
生命周期图例
image.png