Spring框架的介绍
- Spring是分层的java SE/EE应用的full-stack轻量级开源框架。
- 它是以IOC控制反转(Inversion Of Control)和AOP面向切面编程(Aspect Oriented Programming)为核心。
- 提供了表现层springmvc和持久层Spring JDBC以及业务层的事务管理等企业级应用解决方案
- 将开源世界中众多优秀的第三方框架和类库整合。
spring的优点:
● IOC解耦,简化开发
● AOP面向切面编程支持
● 生命式事务支持
● 方便程序测试
● 集成第三方优秀框架
一、IoC的概念
这种将创建对象的权利,由在程序代码中主动new对象的方式,转变为由工厂类创建并且提供给我们,我们使用的时候从容器中去取,变成被动接收的方式,称为控制反转。
IoC本质上就是工厂模式,原来我们是自己主动创建一个对象,主动去获取一个资源。
//Car是接口, 后面是实现类
Car bmw = new Bmw();
Car benZ = new BenZ();
Car audi = new Audi();
现在使用工厂模式,我们需要的对象由工厂去创建,我们不再自己创建,我们只消费对象。
Car bmw = BeanFactory.getBean("bmw");
Car benZ = BeanFactory.getBean("benZ");
Car audi = BeanFactory.getBean("audi");
(1)使用IOC有什么好处?
- 降低类与类之间的耦合度
- 我们不再需要自己创建对象,只要使用对象就可以了
- 使用Spring框架就是使用工厂模式来创建对象,由Spring容器帮我们管理所有的Java对象
(2)创建容器的三种方式
- 类路径配置文件创建容器: ClassPathXmlApplicationContext(“Spring配置文件名字”)
- 本地文件绝对路径创建容器(全路径):FileSystemXmlApplicationContext
- 纯注解方式创建容器: AnnotationConfigApplicationContext
二、属性注入
bean标签
bean标签的属性说明
属性 | 说明 |
id | 容器中唯一的标识 |
name | 还可以有多个名字,逗号、空格、分号隔开 |
class | 指定类全名,指定的是实现类,不是接口 |
scope | 指定bean在容器中作用范围 singleton:默认值,表示这个是单例对象,整个容器中只会创建一个对象 prototype:多例对象,每次获取一个新的对象 request:用于请求域 session:用于会话域 application:用于上下文域 globalsession:用于全局的会话,在分布式开发中 |
init-method | 创建对象时,执行的初始化方法 |
destroy-method | 销毁对象时,执行的方法 |
lazy-init | 是否使用延迟加载,默认是不使用 |
bean的生命周期
scope属性
bean的作用范围和生命周期的说明
scope取值 | 作用范围 | 生命周期 |
singleton单例对象 | 容器一创建就创建这个对象,只要容器不销毁就 一直存在 | 出生:容器创建就出生 活着:只要容器没有销毁就一直存在 死亡:容器关闭时 |
prototype多例对象 | 每次获取对象就创建一个新的对象,使用完毕会 被GC垃圾回收机制回收 | 出生:获取对象的时候 活着:使用过程中 死亡:由GC回收 |
(1)依赖注入(Dependency Injection,简称DI )
1.构造方法注入 applicationContext.xml
<!--
1. 使用构造方法注入
子元素:constructor-arg 构造方法注入
index:每几个位置,从0开始
name:指定形参的名字
type:指定参数的类型
value:简单类型的值:8种基本类型+String类型
ref:赋值引用类型,指定对象的id
-->
<bean class="com.itheima.entity.Customer" id="customer">
<constructor-arg name="id" value="100"/>
<constructor-arg name="name" value="白骨精"/>
<constructor-arg name="male" value="true"/>
<constructor-arg name="birthday" ref="birthday" type="java.util.Date"/>
</bean>
<!-- 引用类型:现在的时间 -->
<bean class="java.util.Date" id="birthday"/>
2.set方法注入 applicationContext.xml
<!-- 2.使用set方法注入 -->
<bean class="com.itheima.entity.Customer" id="customer">
<!-- 属性名:为id value为200 -->
<property name="id" value="200"/>
<property name="name" value="猪八戒"/>
<property name="male" value="true"/>
<property name="birthday" ref="birthday"/>
</bean>
<!-- 引用类型:现在的时间 -->
<bean class="java.util.Date" id="birthday"/>
3.p命名空间注入 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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 使用p命名空间注入,本质上还是set注入
1. 导入p命名空间
2. 简单类型的格式:p:属性名="值"
引用类型的格式:p:属性名-ref="id"
-->
<bean class="com.itheima.entity.Customer" id="customer" p:id="300" p:name="孙悟空" p:male="false" p:birthday-ref="birthday"/>
<!-- 引用类型:现在的时间 -->
<bean class="java.util.Date" id="birthday"/>
</beans>
p名称空间 | 描述 |
p:属性名 | 注入简单类型 |
p:属性名-ref | 注入引用类型 |
(2)集合属性注入
1.单例集合
<!-- list类型 -->
<property name="list">
<list>
<value>张飞</value>
<value>关羽</value>
<value>刘备</value>
</list>
</property>
2.双例集合
<!-- map集合,所有的双引集合也是可以通用的 -->
<property name="map">
<map>
<entry key="cn" value="中国"/>
<entry key="usa" value="美国"/>
<entry key="jp" value="日本"/>
</map>
</property>
3.属性集合
<!-- property集合 -->
<property name="prop">
<props>
<prop key="gz">广州</prop>
<prop key="sh">上海</prop>
<prop key="bj">北京</prop>
</props>
</property>
三、注意
- 创建容器时,配置文件中的所有类都会被实例化
- 注入的集合数据类型如果不是简单类型,则使用标签<ref>,属性bean
- 通过p命名空间注入属性本质上是简化的set注入,需要导入p命名空间
- 集合属性注入时,若数据的格式相同,标签可以互用,如<list>与<set>
- 集合属性注入不同集合,键值对的书写方式细微差别