简介:
- 开源的、用来简化企业级应用开发的、应用开发框架。
特点
- 1)简化开发
spring对常用的api(比如jdbc)做了封装,比如,使用spring
jdbc访问数据库,就不用再考虑如何获取连接与关闭连接了。 - 2)解耦
spring帮我们管理对象之间的依赖关系,这样代码的维护性会大
大提高。 - 3)集成其它框架
spring可以将其它的一些框架集成进来。
比如,可以将定时任务处理框架(Quartz)集成进来。
Spring容器
- Spring框架的核心模块,用来管理对象(包括对象的创建、销毁等等)
- 如何启动Spring容器?
step1. 导包。
step2. 添加Spring配置文件。
step3. 启动容器。
如何创建对象?
1)方式一 无参构造器(或者缺省构造器)
step1. 为类添加无参构造器。
step2. 在配置文件当中,添加相关配置(bean元素)。
step3. 启动容器,调用容器的getBean方法。
2)方式二 静态工厂方法 (了解)
3)方式三 实例工厂方法 (了解)
<!-- 利用无参构造器创建对象 -->
<bean id = "p1" class = "test.Person" scope = "prototype"/>
<!-- 静态工厂方法创建对象 -->
<bean id = "cal" class = "java.util.Calendar" factory-method = "getInstance"/>
<!--
factory-bean:值是一个bean的id。
factory-method:指定一个实例方法。
注:
容器会调用c1这个bean的getTime方法
来创建对象。
-->
<bean id = "date" factory-bean="cal" factory-method="getTime"/>
<bean id = "poo" class="test.Poo" init-method="init" destroy-method = "destroy"/>
作用域
1)默认情况下,容器对于某个bean元素,只会创建一个实例。
2)如何设置scope=”prototype”,则会创建多个。
注:默认值为”singleton”。
生命周期 (对资源进行管理)
1)初始化方法
使用init-method指定初始化方法。
2)销毁方法
使用destroy-method指定销毁方法。
注:
a.容器关闭之前,会调用销毁方法。
b.只有当作用域为singleton时,销毁
方法才会执行。
延迟加载 (了解)
1)默认情况下,容器启动之后,会将所有作用域为singleton的
bean先创建好。
2)所谓延迟加载,指的是容器启动之后,不再创建这些对象(即使作用域为
singleton)。
IOC和DI
- IOC是什么 (Inversion Of Controll 控制反转)?
对象之间的依赖关系由容器来建立。
DI是什么 (Dependency Injection 依赖注入)?
容器调用set方法或者构造器来建立依赖关系。
注:
IOC是目标,DI是手段
构造器注入
step1 添加相应的构造器。
step2. 使用constructor-arg元素来配置构造器注入。
自动装配(了解)
容器依据某些规则,自动建立对象之间的依赖关系。默认情况下,容器不会自动装配。
<bean id="cp1" class="auto.Computer"/>
<!--
autowire:表示自动装配(即容器依据某些
规则,自动建立对象之间的依赖关系)。
byName: 容器依据属性名查找对应的bean
(即以属性名作为bean的id),找到之后,调用
set方法来注入。
注:如果找不到对应的bean,不会注入。
byType: 容器依据属性类型查找对应的bean
(即bean的类型与属性类型一致),找到之后,
调用set方法来注入。
注:如果找不到对应的bean,不会注入。
如果找到多个,会出错。
constructor:类似于byType,只不过调用的是
构造器来注入。
-->
<bean id="mg" class="auto.Manager"
autowire="byType"/>
(6)注入基本类型的值
使用value属性来注入。
<!-- 使用spring表达式读取其它bean的属性值 -->
<bean id="t1" class="value.Teacher">
<property name="name"
value="#{stu1.name}"/>
<property name="interest"
value="#{stu1.interest[0]}"/>
<property name="score"
value="#{stu1.score['英语']}"/>
<property name="pageSize"
value="#{config['pageSize']}"/>
</bean>
<!-- 注入基本类型的值 -->
<bean id="stu1" class="value.Student">
<property name="name" value="小花"/>
<property name="age" value="22"/>
<!-- 注入集合类型的值 -->
<property name="interest">
<list>
<value>抽烟</value>
<value>喝酒</value>
<value>烫头</value>
<value>烫头</value>
</list>
</property>
<property name="city">
<set>
<value>金陵</value>
<value>杭州</value>
<value>西安</value>
</set>
</property>
<property name="score">
<map>
<entry key="英语" value="80"/>
<entry key="math" value="60"/>
</map>
</property>
<property name="db">
<props>
<prop key="username">Sally</prop>
<prop key="password">1234</prop>
</props>
</property>
</bean>
<!-- 将集合类型的值配置成一个bean -->
<util:list id="interestBean">
<value>钓鱼</value>
<value>做菜</value>
<value>看电视</value>
</util:list>
<util:set id="cityBean">
<value>长沙</value>
<value>岳阳</value>
<value>华容</value>
</util:set>
<util:map id="scoreBean">
<entry key="english" value="70"/>
<entry key="math" value="90"/>
</util:map>
<util:properties id="dbBean">
<prop key="username">Tom</prop>
<prop key="password">1234</prop>
</util:properties>
<!-- 以引用的方式注入集合类型的值 -->
<bean id="stu2" class="value.Student">
<property name="interest"
ref="interestBean"/>
<property name="city"
ref="cityBean"/>
<property name="score"
ref="scoreBean"/>
<property name="db"
ref="dbBean"/>
</bean>
<!-- 读取属性文件(.properties)的内容 -->
<!--
location:指定要读取的属性文件的位置及
文件名。
注:
classpath:表示依据类路径去查找。
容器依据路径读取属性文件的内容,并且
将这些内容存放到Properties对象上。
-->
<util:properties id="config"
location="classpath:config.properties"/>
<util:properties id="db"
location="classpath:db.properties"/>
<!-- 配置连接池 -->
<bean id="ds"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="#{db.driver}"/>
<property name="url"
value="#{db.url}"/>
<property name="username"
value="#{db.user}"/>
<property name="password"
value="#{db.pwd}"/>
<property name="initialSize"
value="#{db.initsize}"/>
</bean>