Spring框架入门及配置
前言
记录spring框架相关内容
一、Spring简介
1.Spring是什么?
Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。
提供了展现层 SpringMVC 和持久层 Spring JDBCTemplate 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE 企业应用开源框架
2.Spring发展历程
1997 年, IBM提出了EJB 的思想
1998 年,SUN制定开发标准规范 EJB1.0
1999 年,EJB1.1 发布
2001 年,EJB2.0 发布
2003 年,EJB2.1 发布
2006 年,EJB3.0 发布
Rod Johnson ( Spring 之父)
Expert One-to-One J2EE Design and Development(2002)
阐述了 J2EE 使用EJB 开发设计的优点及解决方案
Expert One-to-One J2EE Development without EJB(2004)
阐述了 J2EE 开发不使用 EJB的解决方式(Spring 雏形)
2017 年 9 月份发布了 Spring 的最新版本 Spring5.0 通用版(GA)
3.Spring优势
1)方便解耦,简化开发
通过 Spring 提供的 IoC容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度耦合。
用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
2)AOP 编程的支持
通过 Spring的 AOP 功能,方便进行面向切面编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松实现。
3)声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务管理,提高开发效率和质量。
4)方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
4.Spring体系结构
二、spring开发步骤简介
1.总体开发步骤
创建xml配置文件,通过id标识当前全限名,通过spring客户端.getBean方法传入id标识,框架再读取xml文件,xml返回全限名到框架内部。框架通过反射帮你创建对象,并把对象返回给调用者。
导入 Spring 开发的基本包坐标
编写 Dao 接口和实现类
创建 Spring 核心配置文件
在 Spring 配置文件中配置 UserDaoImpl
使用 Spring 的 API 获得 Bean 实例
2.基本流程案例
2.1导包
在pom.xml文件中导包:
2.2添加相应的dao接口以及实现类
目录结构如下
实现类代码:
package com.zqjy.dao.impl;
import com.zqjy.dao.UserDao;
public class UserDaoImpl implements UserDao {
public void save(){
System.out.println("save running");
}
}
2.3创建spring配置文件
在rescoures中创建配置文件,一般习惯命名为applicationContext.xml
2.4创建测试类
package com.zqjy.demo;
import com.zqjy.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserDaoDemo {
public static void main(String[] args) {
ApplicationContext app =new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao =(UserDao) app.getBean("userdao");
userDao.save();
}
}
运行得到结果:
三 Spring配置文件
3.1Bean标签的基本配置
3.1.1 scope:指对象的作用范围
创建专门的测试单元,测试不同scope下的区别
记着引入junit坐标
编写test方法
此时applicetionContext.xml文件中配置为
运行
可以看到运行得到的地址一样。
改成prototype并运行:
地址不一样,即容器中存在的user dao不是同一个对象。
scope的不同,也会导致bean创建对象的时间不同。断点测试:
当scope为singleton时
配置文件一经加载就创建,此时还没有getbean
当scope为prototype时
此时加载完配置文件,对象没有创建,在getbean处创建。
总结
1)当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
Bean的生命周期:
对象创建:当应用加载,创建容器时,对象就被创建了
对象运行:只要容器在,对象一直活着
对象销毁:当应用卸载,销毁容器时,对象就被销毁了
2)当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时实例化Bean
对象创建:当使用对象时,创建新的对象实例
对象运行:只要对象在使用中,就一直活着
对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了
3.1.2 Bean生命周期配置
init-method:指定类中的初始化方法名称
destroy-method:指定类中销毁方法名称
加入两个方法
修改配置:
发现destory方法没来得及及打印方法就执行完毕了
手动关闭一下
销毁方法执行
3.1.3 Bean实例化的三种方式
无参构造方法实例化
工厂静态方法实例化
工厂实例方法实例化
1工厂静态实例化:
创建工厂
配置:
2 工厂实例方法实例化
配置:
3.2Bean的依赖注入
3.2.1入门
创建业务层接口,以及业务层接口实现类。模拟web层的类。
3.2.2 Bean的依赖注入分析
目前UserService实例和UserDao实例都存在与Spring容器中,当前的做法是在容器外部获得UserService实例和UserDao实例,然后在程序中进行结合。
因为UserService和UserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在Spring容器中,将UserDao设置到UserService内部。
3.2.3 Bean的依赖注入概念
依赖注入是Spring框架核心IOC的具体实现。
在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。
IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。
那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。
简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。
怎么将UserDao怎样注入到UserService内部呢?
构造方法
set方法
1 set方法
设置相应的setUserDao方法,直接将userdao注入
配置文件,这里的name为set后面名字呢首字母小写
p名称空间注入,本质也是set注入。
此时就可以在名称空间中用属性代表property子标签。
此时可以得到和之前一样的结果。
2 构造方法
创建有参构造器和无参构造器
配置文件:
此时name为构造器属性名。
运行成功。
3.2.4 Bean的依赖注入的数据类型
上面的操作,都是注入的引用Bean,除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。
注入数据的三种数据类型
普通数据类型
引用数据类型
集合数据类型
其中引用数据类型,此处就不再赘述了,之前的操作都是对UserDao对象的引用进行注入的,下面将以set方法注入为例,演示普通数据类型和集合数据类型的注入。
1 注入普通数据类型。
在userdaoimpl中设置set方法,并配置文件:
可以看到运行结果:
2 集合的注入
在userdaoimpl中创建相应的属性和方法:、
创建一个User类并添加相关属性用于测试:
配置文件
运行结果如下:
3.3 引入其他配置文件(分模块开发)
实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载。
此时加载主文件,分文件也会加载。