Spring介绍
框架的作用
Spring的优势
(1)Spring是一站式框架,因为Spring框架的性质是属于容器性质,容器中装了什么对象就有什么功能,所以可以一站式。
(2)不仅不排斥其他框架、还能其他框架帮忙管理对象。
(3)AOP支持
(4)基于IOC思想
(5)Spring jdbc
(6)aop 事务
(7)Junit测试支持。
Spring概念
1.Spring思想
IOC:Inverse of control 反转控制
将我们创建对象的方式反转了。
以前对象的创建由我们开发人员自己维护,包括依赖关系也是我们自己注入的
使用Spring之后,对象的创建以及依赖关系可以由Spring完成创建以及注入
反转控制:就是反转了对象创建的方式,从我们自己创建转交给了程序(Spring)创建
DI:Dependency Injection 依赖注入
实现IOC实现需要DI做支持
注入方式:
Set 方法注入
构造方法注入
字段注入
注入的类型:
值类型注入: 8大基本数据类型
应用类型注入:将依赖对象注入
2.Spring中工厂(容器)
工厂factory
设计模式,提供的方法一般是静态的,
帮我们生产出对象的。
了解ApplicationContext和BeanFactory
BeanFactory接口:
Spring原始接口,针对原始接口的实现类功能较为单一
BeanFactory接口实现类 的容器,特点:每次在获取对象的时候才会创建对象
ApplicationContext接口:
容器在创建的时候,容器里面配置的所有对象会被创建,并且提供更多的功能。
有2个实现类:
ClassPathXmlApplicationContext //从类路径加载配置文件
new ClassPathXmlApplicationContext( "applicationContext.xml" );
FileSystemXmlApplicationContext //从硬盘绝对路径中加载配置文件
new FileSystemXmlApplicationContext(“d:/xxx/yyy/zzz”)
总结:
在web开发中,使用ApplicationContext,在资源亏匮乏的环境下可以使用BeanFactory。
BeanFactory可以理解为时间换取空间,ApplicationContext可以理解为空间换取时间
Spring配置详解
Bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
<!--将User对象交给Spring管理-->
<!--
bean元素:使用该元素的描述需要spring管理的对象
class属性:被管理对象的全路径(完整类名)
name属性:被管理的对象起个名字,获取该对象时根据该名称获取对象
可以重复,可以使用特殊字符
id属性:和name属性一样
不可重复,不能使用特殊字符
总结:尽量使用name
-->
<bean name="user"
class="com.demo.User"
init-method="init" //init-method方法在初始化对象时调用地方法
destroy-method="destroy"></bean> //destory-method 在对象消亡时调用的方法
</beans>
Scope属性
Prototype:多例原型
被他标识的对象为多例对象,每次获取的时候都创建一个新的对象,
对于线程不安全的对象,往往使用Prototype。
<bean name="user1" scope="prototype"
class="com.hyx.a_helloworld.User"></bean>
Singleton:单例(默认值)
被他标识的对象为单例对象,每次获取的时候都创建对象都是同一个
<bean name="user" scope="singleton"
class="com.hyx.a_helloworld.User"></bean>
Request
Web环境下,对象与Request生命周期一致
Session
Web环境下,对象与Session生命周期一致
生命周期
init-method:指定初始化方法,spring在对象创建之后立即调用
destroy-method:指定摧毁方法,spring容器在关闭的时候 会销毁所有容器中的 对象之前调用
User类中
public void init(){
System.out.println("init.......");
}
public void destroy(){
System.out.println("destroy.......");
}
<bean name="user2"
scope="singleton"
init-method="init"
destroy-method="destroy"
class="com.hyx.a_helloworld.User"></bean>
此处,destory并没有执行,是因为程序的运行速度大于对象消亡时间,
也就是在对象消亡时,程序已经跑完了,此刻对象还没有消亡
Spring创建对象的方式
无参的构造方法的方式
为User类中添加一个无参构造方法,并在其中输出字符串
<bean name="user3" class="com.hyx.a_helloworld.User"></bean>
静态工厂实例化 的方式
<bean name="user4"
factory-method="getUserFactory"
class="com.hyx.a_helloworld.User"></bean>
User
public static User getUserFactory(){
System.out.println("我是工厂");
return new User();
}
实例工厂实例化 方法
总结
理解空间换时间,ApplicationContext,使用该接口,在读取.xml文件时,会将所有的bean的对象全部先创建
使用时直接去拿,所有有多少个bean,对应的实体类的构造方法就会执行多少遍
Spring的分模块配置
将不同的模块配置放到不同的配置文件中。
每个配置文件都需要导入对应约束
ApplicationContext.xml
applicationContext-Dao.xml:所有DAO对象配置
applicationContext-Service.xml:所有Service对象配置
<import resource="applicationContext.xml"></import>