目录
Spring简介
Spring是什么
Spring是分层的Java SE/EE应用的full-stack轻量级开源框架,以Ioc(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核
提供了展现层SpringMVC和持久层Spring JDBCTemplate以及业务层事务管理等众多的应用技术,还能整合开源世界众多注明的第三方框架和类库,逐渐成为使用最多的Java EE 企业应用开发框架
Spring发展
……
Spring优势
- 方便解耦,简化开发
通过Spring提供的Ioc容器,可以将对象间的依赖关系交由Spring控制,避免硬编码造成的过渡耦合。
用户不必为单例模式类,属性文件解析等底层需求编写代码,可以更加专注于上层的应用 - AOP编程支持
通过Spring的AOP功能,方便面向切面编程,许多不容易用传统OOP实现的功能可以通过AOP实现 - 声明式事务的支持
通过声明式方式灵活的进行事务管理,提高开发效率和质量。将开发者从单调烦闷的事务管理代码中解脱出来 - 方便程序测试
可以使用非容器依赖的编程方式进行几乎所有的测试工作。 - 方便集成各种优秀框架
Struts、Hibernate、Hessian、Quartz - 降低Java EE API 的使用难度
Spring对Java EE API(例如JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使用这些API使用难度大大减低 - Java源码经典学习典范
Spring源代码设计巧妙,结构清晰,匠心独用……
Spring体系结构
Core Container :核心容器
Spring快速入门
Spring程序开发步骤
不用Spring的一般步骤
cc.mllt.service.UserServicelmpI
UserDao userDao = new UserDaoImpI(
cc.mllt.dao.UserDaoImpI
save方法 update方法 ……
xml配置文件
id标识 = cc.mllt.dao.UserDaoImpI
使用Spring框架
cc.mllt.service.UserServicelmpI
UserDao userDao = Spring客户端.getBean(id标识)
cc.mllt.dao.UserDaoImpI
save方法 update方法 ……
xml配置文件
id标识 = cc.mllt.dao.UserDaoImpI
Spring框架
读取xml文件 根据id标识获取bean全限定名 通过反射创建Bean对象 返回对象
图示
总结
- 导入Spring开发的基本包坐标
- 编写Dao接口和实现类
- 创建Spring核心配置文件
- 在Spring配置文件中配置UserDaoImpI
- 使用Spring的API获得Bean实例
实战
项目文件:黑马程序员SSM框架教程\edu01\Demo1
创建项目
添加Spring框架
在pom.xml文件中添加以下内容
<!--Spring Framework--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.5.RELEASE</version> </dependency>
编写接口方法
在创建出来的UserDao中简单的写一个方法
public interface UserDao { public void save(); }
实例化接口
创建完成目录结构如下
在新建的这个UserDaoImpl文件中写入以下内容
public class UserDaoImpl implements UserDao { public void save(){ System.out.println("[萌狼蓝天]save running...."); } }
创建配置文件
配置完成
编写测试代码
写入如下代码
package cc.mllt.dao.demo; import cc.mllt.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"); // 获取xml文件 UserDao userDao = (UserDao) app.getBean("userDao"); // ① app.getBean("userDao")里面写的是刚才xml文件里面配置的bean的id名称 // ② 将Objec类型强制转换为UserDao类型 userDao.save(); } }
知识小结
Spring开发步骤
- 导入坐标
- 创建bean
- 创建applicationContext.xml(这个名称可以自定义)
- 在配置文件中进行配置
- 创建ApplicationContext对象getBean
Spring配置文件
bean标签基本配置
用于配置对象交由Spring创建,默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能成功创建
基本属性
- id:Bean实例在Spring容器中的唯一标识
- class:Bean的全限定名称
bean标签范围配置
scope:指的是对象的作用范围,取值如下:
| 取值范围 | 说明 |
| singleton | 默认值,单例的。(单对象) |
| prototype | 多例的。(多对象) |
| request | WEB项目中,Spring创建一个Bean对象,将对象放入到request域中 |
| session | WEB项目中,Spring创建一个Bean对象,将对象放入到session域中 |
| global session | WEB项目中,应用在Portlet环境,如果没有Portlet环境那么globalSession相当于session |
测试scope
本测试基于项目
黑马程序员SSM框架教程\edu01\Demo1
<bean id="userDao" class="cc.mllt.dao.impl.UserDaoImpl" scope="singleton"/>
添加单元测试包
在pom.xml中添加如下代码
<!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency>
测试scope
@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); }
观察结果发现,是一样的,说明在容器中只存在一个
回到applicationContext.xml中,更改scope属性值
<bean id="userDao" class="cc.mllt.dao.impl.UserDaoImpl" scope="prototype"/>
继续测试
观察结果发现,输出的结果不一致(地址不一样)。
说明容器中存在的UserDao不止一个
测试bean的创建时机、
测试
回到applicationContext.xml中,更改scope属性值
<bean id="userDao" class="cc.mllt.dao.impl.UserDaoImpl" scope="singleton"/>
回到applicationContext.xml中,更改scope属性值
<bean id="userDao" class="cc.mllt.dao.impl.UserDaoImpl" scope="prototype"/>
再进行测试
总结
1)当scope的取值为singleton时
Bean的实例化个数: 1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
Bean的生命周期:
●对象创建: 当应用加载,创建容器时,对象就被创建了
●对象运行: 只要容器在,对象一直活着
●对象销毁: 当应用卸载,销毁容器时,对象就被销毁了
2)当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean0方法时实例化Bean
●对象创建: 当使用对象时,创建新的对象实例
●对象运行: 只要对象在使用中,就一-直活着
●对象销毁: 当对象长时间不用时,被Java的垃圾回收器回收了
Bean的生命周期
init-method:指定类中的初始化方法名称
destroy-method:指定类中销毁方法的名称
public void ml_init(){ System.out.println("[萌狼蓝天]]UserDaoImpl-初始化方法"); } public void ml_destroy(){ System.out.println("[萌狼蓝天]UserDaoImpl-销毁方法"); }
目前这两个方法没有被使用
为了能让这两个方法被使用,现在去修改配置文件applicationContext.xml
<bean id="userDao" class="cc.mllt.dao.impl.UserDaoImpl" scope="prototype" init-method="ml_init" destroy-method="ml_destroy"/>
回到测试代码
<?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="userDao" class="cc.mllt.dao.impl.UserDaoImpl" scope="singleton" init-method="ml_init" destroy-method="ml_destroy"/> </beans>
为什么没有销毁?
因为这是一个单元测试,并没有在Tomcat服务器内部
单元测试一执行完毕就会销毁,没有来得及执行销毁方法中的打印内容
那怎么样测试呢?将容器设置为手动关闭!

































