SSM框架学习day01_简介、入门、配置文件
一、Spring简介
1.1 Spring是什么
Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IoC(Inverse Of Control:控制反转)和AOP(Aspect Oriented Programming:面向切面编程)为内核。
1.2 Spring发展历程
可以认为EJB是Spring的前身,Rod Johnson(Spring之父)
1.3 Spring的优势
- 方便解耦,简化开发
通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring控制,避免硬编码导致过度耦合。用户不用为单例模式类、属性文件解析等很低层的需求编写代码,可以更专注与上层的应用。 - AOP编程的支持
通过AOP功能,方便进行面向切面编程。 - 声明式事务的支持
可以通过声明式方式灵活进行事务管理,提高开发效率和质量。 - 方便程序测试
junit - 方便集成优秀框架
Spring对各种优秀框架的支持 - 降低JavaEE API的使用难度
对JavaEE API(JDBC、远程调用等)进行了薄薄的封装层,使这些API的使用难度降低 - Java源码是经典学习范例
精妙的源码
1.4 Spring的体系结构
Test代表所有部分都可以放进Test里测试
从下往上,层层递进
二、Spring快速入门
2.1 Spring程序开发步骤
本来需要用户创建新的实例对象, 现在对象由Spring框架构建。
步骤:
- 首先导入Spring开发的基本包坐标,就是jar包
- 编写DAO接口和实现类
- 创建xml文件(Spring核心配置文件)
- 在Spring配置文件中配置UserDaolmpl
- 通过Spring的API获得Bean实例
- 导入坐标
pom.xml文件中配置spring
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
- 创建Bean
- 新建UserDAO接口,有一个
save()
方法 - 新建impl文件夹,新建类UserDaoimpl实现接口,save方法:
System.out.println("save running...");
- 新建UserDAO接口,有一个
- 在resources中创建applicationContext.xml
- 在配置文件中进行配置
<bean id="userDao" class="com.hf.dao.impl.UserDaoimpl"></bean>
- 创建ApplicationContext对象getBean,新建UserDaoDemo文件
public class UserDaoDemo {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDAO userDao = (UserDAO) app.getBean("userDao");
userDao.save();
}
}
运行结果:
save running...
注:若在resources中创建applicationContext.xml时没有Spring config选项,则需要右键项目,Add Frameworl support,选中SpringMVC并点击OK。
三、Spring配置文件
3.1 Bean标签的基本配置
用于配置对象交由Spring来构建。
默认情况下调用的是类中的无参构造,如果没有无参构造则不能创建成功。
基本属性:
+ id:Bean实例在Spring容器中的唯一标识
+ class:Bean的全限定名称
3.2 Bean标签范围配置
scope:指对象的作用范围,取值:
取值范围 | 说明 |
---|---|
singleton | 默认值,单例的 |
prototype | 多例的 |
request | WEB项目中,Spring创建一个Bean的对象,将对象存入request域中 |
session | WEB项目中,Spring创建一个Bean的对象,将对象存入session域中 |
global session | WB项目中,应用在Portlet环境,如果没有,则global session相当于session |
其中singleton就是单一的,prototype是原型的意思,也就是如果配置成prototype,在容器中拿对象的话,每次拿都是一个新的对象。
引入junit,在test文件夹下创建SpringTest.java
public class SpringTest {
@Test
//测试scope属性
public void test1(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDAO userDao1 = (UserDAO) app.getBean("userDao");
UserDAO userDao2 = (UserDAO) app.getBean("userDao");
System.out.println(userDao1);
System.out.println(userDao2);
}
}
单例模式运行结果:
com.hf.dao.impl.UserDaoimpl@23fe1d71
com.hf.dao.impl.UserDaoimpl@23fe1d71
多例模式运行结果:
com.hf.dao.impl.UserDaoimpl@43bd930a
com.hf.dao.impl.UserDaoimpl@33723e30
不同模式,创建对象实例的时机不同
scope=singleton
:加载配置文件,创建Spring容器时,就创建Bean
scope=prototype
:getBean时创建对象实例
- 当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置Bean实例
Bean的生命周期:
- 对象创建:当应用加载,创建容器时,对象就被创建了
- 对象运行:只要容器在,对象一直活着
- 对象销毁:当应用卸载,销毁容器时,对象就被销毁了
- 当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当用getBean()方法实时例化Bean
Bean的生命周期:
- 对象创建:当使用对象时,创建新的对象实例
- 对象运行:只要对象在使用中,就一直活着
- 对象销毁:当对象长时间不用时,就被Java的垃圾回收器回收了
3.3 Bean生命周期配置
- init-method:指定类中初始化方法名称
- destory-method:指定类中销毁方法名称
applicationContext.xml
<bean id="userDao" class="com.hf.dao.impl.UserDaoimpl" init-method="init" destroy-method="destroy"></bean>
UserDaoimple.java
public void init(){
System.out.println("初始化方法");
}
public void destroy(){
System.out.println("销毁方法");
}
运行结果:
UserDaoImpl创建
初始化方法
com.hf.dao.impl.UserDaoimpl@4e718207
注:此处虽然规定了destroy-method但是并没有打印销毁方法。需要手动关闭时,程序才能意识到要destroy了,才会调用此方法。但app没有close方法,所以:
- 可以将app强转成
ClassPathXmlApplicationContext
类型,然后调用close方法 - 直接用
ClassPathXmlApplicationContext
接受app,即:ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
运行结果:
UserDaoImpl创建
初始化方法
com.hf.dao.impl.UserDaoimpl@4e718207
销毁方法
3.4 Bean实例化三种方式
- 无参构造方法实例化
重点掌握 - 工厂静态方法实例化
StaticFactory.java
public static UserDAO getUserDao(){
return new UserDaoimpl();
}
applicationContext.xml
<bean id="userDao" class="com.hf.factory.StaticFactory" factory-method="getUserDao" ></bean>
- 工厂实例方法实例化
DynamicFactory.java
public UserDAO getUserDao(){
return new UserDaoimpl();
}
applicationContext.xml
<bean id="factory" class="com.hf.factory.DynamicFactory"></bean>
<bean id="userDao" factory-bean="factory" factory-method="getUserDao"></bean>