一、Spring概述
1、什么是Spring
1、Spring是分层的Java SE/EE应用full-stack(全栈)轻量级开源框架
核心是IOC(Inverse Of Control:控制反转)和AOP(Aspect Oriented Programming:面向切面编程)
2、Spring是一个全栈应用框架,提供了表现层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多应用技术
3、Spring还能整合开源世界众多注明的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架
2、为什么学习Spring
3、Spring的特点及优势
1、方便解耦,简化开发
2、AOP编程的支持
3、声明式事务的支持
4、方便程序的测试
5、方便集成各种优秀框架
6、降低Java EE API的使用难度
7、Java源码是经典学习范例
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)
4、Spring体系结构
二、IoC概述
大致可以这样理解,在以往的三层框架编写时,web层调用service层,service调用dao层,这样一套流程,如果我们想改变其中一部分代码,那么这些一连串的代码流程都需要改变,所以需要有一种方法可以动态的改变其中的调用内容,比如在web层调用service层时,service是写死了的调用的到层方法,我们把service剥离出来,可以动态的改变调用的是哪一个dao类方法,怎么办呢,我们在web层告诉service调用某一个类的方法,这个思想,称之为IoC
三、Spring入门
1、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 id="dao层接口名" class="该dao层的实现类的全路径"></bean>
</beans>
2、获取Spring核心配置文件的bean标签内容
// 读取applicationContext.xml配置文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取具体类
dao层接口类型 dao层接口名 = (类型转换) applicationContext.getBean("bean标签中的id名");
//通过dao层接口名调用具体实现类的方法
四、Spring相关API
1、Spring核心接口
a、BeanFactory
IOC容器的顶级接口,它定义了IOC的最基础的功能,但是其功能比较简单,一般面向Spring自身使用
在第一次使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化[什么时候用什么时候创建]—>【懒汉设计】
public class BeanFactory {
// 声明存储对象的容器(map集合)
private static Map<String, Object> ioc = new HashMap<>();
// 静态代码块,初始化ioc容器
static {
String id = null;
String className = null;
Object object = null;
try {
// 1.通过类加载器读取 beans.xml
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml");
// 2.创建dom4j核心解析器对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(in);
// 3.编写xpath表达式
String xpath = "//bean";
// 4.获取所有的bean标签对象
List<Element> list = document.selectNodes(xpath);
// 5.遍历集合,创建对象实例,设置到ioc容器中
for (Element element : list) {
id = element.attributeValue("id");
className = element.attributeValue("class");
object = Class.forName(className).newInstance();
// 设置到map集合
ioc.put(id, object);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 从ioc容器中获取指定id的对象实例
public static Object getBean(String id) {
return ioc.get(id);
}
}
b、ApplicationContext
这是在BeanFactory基础上衍生出的接口,它扩展了BeanFactory的功能,一般面向程序员使用
在容器启动时,一次性创建并加载所有的Bean,[初始化的时候全创建好]—>【饿汉设计】
2、Spring核心实现类
a、ClassPathXmlApplicationContext
b、FileSystemXmlApplicationContext
c、AnnotationConfigApplicationContext
3、Spring核心实现方法
a、通过指定id获取对象的实例,需要手动强转
// 读取applicationContext.xml配置文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取UserDao
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
// 调用方法
userDao.getUser();
b、通过指定类型获取对象的实例,不需要强转
// 读取applicationContext.xml配置文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取UserDao
UserDao userDao = applicationContext.getBean(UserDao.class);
// 调用方法
userDao.getUser();
注:如果同一个接口类型下有多个对象实例,会报错
原因是不能找到一个唯一的UserDao的实现类对象
c、通过指定id和类型获取对象的实例
// 读取applicationContext.xml配置文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取UserDao
UserDao userDao = applicationContext.getBean("userDao",UserDao.class);
// 调用方法
userDao.getUser();
五、Spring配置文件
1、Bean标签配置
a、相关属性
id:在ioc容器中的唯一标识
class:创建对象实例的全路径名
scope:声明对象的作用范围
singleton:单例对象(默认)
prototype:多例对象
init-method:在对象创建时,执行此方法
destroy-method:在对象销毁时,执行此方法
扩展:
scope取值:request-->web项目中,Spring创建一个Bean的对象, 将对象存在request中
session-->web项目中,Spring创建一个Bean的对象, 将对象存在session中
globalSession-->(用于分布式web开发)创建实例绑定全局Session对象
b、作用范围
主要是针对scope属性来讲解Bean的使用范围
singleton:单例对象
* 何时创建?
ioc容器初始化时,创建对象
* 对象何时运行?
还要ioc容器在,对象就一直在
* 何时销毁?
ioc容器关闭时,销毁对象
prototype:多例对象
* 何时创建?
在调用getBean()方法时,创建
* 对象运行?
一直使用就一直活着
* 何时销毁?
当对象不再使用后,根据JVM GC机制垃圾回收
c、生命周期
init-method 和 destroy-method的使用
单例(默认)
在相应的实现类创建init方法:init-method属性指向该方法,对象创建时执行
创建destroy方法:destory-method属性指向该方法,对象销毁(close)时执行
多例(scope="prototype")
在相应的实现类创建init方法:init-method属性指向该方法,对象创建时执行
创建destroy方法:destory-method属性指向该方法,什么时候销毁由JVM决定
2、创建对象的三种方式
a、无参构造
Spring框架,默认使用无参构造方法,进行创建对象,如果没有提供无参则构建对象失败!!!
b、工厂静态方法【了解】
c、工厂普通方法【了解】
六、依赖注入
DI:依赖注入,Dependency Iniection的缩写
指Spring创建对象的过程中,将对象依赖属性(常量,对象,集合)通过配置设置给该对象
就是给对象中的成员进行赋值操作
相关坐标:
<dependencies>
<!--spring的核心坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 设置编译版本为1.8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
1、依赖注入方式
a、构造方法注入
在bean标签中提供了一个子标签来完成构造方法的注入
方式一:一个参数
name :构造方法参数名称
value :简单数据类型(String,int,double)
ref :引用数据类型(从ioc容器中获取的对象)
<bean id="接口名" class="实现类的全路径">
<constructor-arg name="参数名" value="简单数据类型参数" ></constructor-arg>
</bean>
<bean id="接口名" class="实现类的全路径">
<constructor-arg name="参数名" ref="引用数据类型参数名" ></constructor-arg>
</bean>
方式二:多个参数(索引从0开始)【了解】
index :构造方法参数的索引
type :该索引对应的java类型(全路径名)
value :简单数据类型
ref :引用数据类型
<bean id="接口名" class="实现类的全路径">
<constructor-arg index="0" type="引用参数的全路径" ref="引用参数名"></constructor-arg>
<constructor-arg index="1" type="简单数据类型" value="简单数据类型参数"></constructor-arg>
</bean>
b、set方法注入
在接口实现类中提供set方法
使用set方法注入,在bean标签下提供了一个
name :set方法的属性名
value :简单数据类型
ref :引用数据类型
c、P命名空间注入
引入p命名约束
xmlns:p="http://www.springframework.org/schema/p"
bean标签中提供属性:p:接口名-ref=”引用数据类型”;p:接口名-value=”引用数据类型”;
2、依赖注入的数据类型
a、注入实体类
<bean id="实体类" class="实体类的全路径">
<property name="username" value="zhangsan"/>
<property name="age" value= "13"/>
</bean>
b、注入引用类型
c、注入集合类型
单列集合注入:
<!--注入List集合-->
<property name="list">
<list>
<value>张三</value>
<value>李四</value>
<value>王五</value>
</list>
</property>
<!--注入Set集合-->
<property name="set">
<set>
<value>古力娜扎</value>
<value>玛尔扎哈</value>
<value>撒有哪啦</value>
</set>
</property>
<!--注入Array数组-->
<property name="array">
<array>
<value>马蓉</value>
<value>陶吉吉</value>
<value>宋吉吉</value>
</array>
</property>
双列集合注入:
<!-- Map集合 -->
<property name="map">
<map>
<entry key="m1" value="v1"></entry>
<entry key="m2" value="v2"></entry>
<entry key="m3" value="v3"></entry>
</map>
</property>
<!-- Properties集合 -->
<property name="prop">
<props>
<prop key="p1">v1</prop>
<prop key="p2">v2</prop>
<prop key="p3">v3</prop>
</props>
</property>
七、模块化配置文件
1、applicationContext-dao.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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">
<!--
只配置dao层实现类
-->
<bean id="userDao" class="com.itfxp.dao.impl.UserDaoImpl"></bean>
</beans>
2、applicationContext-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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">
<!--
配置service层的实现类
-->
<bean id="userService" class="com.itfxp.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
</beans>
总、applicationContext.xml
<!--
加载从配置文件
-->
<import resource="classpath:applicationContext-dao.xml"></import>
<import resource="classpath:applicationContext-service.xml"></import>