Spring
一、Spring概念
百度百科 https://baike.baidu.com/item/spring%E6%A1%86%E6%9E%B6/2853288?fr=aladdin
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:任何Java应用
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
Spring的初衷:
1、JAVA EE开始应该更加简单。
2、使用接口而不是使用类,是更好的编程习惯。Spring将使用接口的复杂度几乎降低到了零。
3、为JavaBean提供了一个更好的应用配置框架。
4、更多地强调面向对象的设计,而不是现行的技术如JAVA EE。
5、尽量减少不必要的异常捕捉。
6、使应用程序更加容易测试。
Spring的目标:
1、可以令人方便愉快的使用Spring。
2、应用程序代码并不依赖于Spring APIs。
3、Spring不和现有的解决方案竞争,而是致力于将它们融合在一起。
Spring的基本组成:
1、最完善的轻量级核心框架。
2、通用的事务管理抽象层。
3、JDBC抽象层。
4、集成了Toplink, Hibernate, JDO, and iBATIS SQL Maps。
5、AOP功能。
6、灵活的MVC Web应用框架。
IOC:Inverse of Control (反转控制)
反转控制就是反转了对象的创建方式 从我们自己创建反转给了程序(spring)
DI:Dependency Injection(依赖注入)
实现IOC思想需要 DI做支持。
注入方式:
set方法注入
构造方法注入
字段注入
注入类型:
值类型注入 8大基本数据类型(byte short char int float long double boolean)
引用类型注入 将依赖对象注入
ApplicationContext&BeanFactory
BeanFactory接口
spring原始接口.针对原始接口的实现类功能较为单一
BeanFactory接口实现类的容器.特点是每次在获得对象时才会创建对象
ApplicationContext
每次容器启动时就会创建容器中配置的所有对象.并提供更多功能
丛类路径下加载配置文件:ClassPathXmlApplicationContext
从硬盘绝对路径下加载配置文件:FileSystemXmlApplicationContext("d:/xxx/yyy/xxx")
结论:web开发中,使用applicationContext. 在资源匮乏的环境可以使用BeanFactory.
二、Spring配置
Spring创建对象的方式
1 空参构造方式
2 静态工厂(了解)
3 实例工厂(了解)
Bean元素 使用该元素描述需要spring容器管理的对象
<1> class属性:被管理对象的完整类名.
<2> name属性:给被管理的对象起个名字.获得对象时根据该名称获得对象.
可以重复.可以使用特殊字符.
<3> id属性: 与name属性一模一样.
名称不可重复.不能使用特殊字符.
结论: 尽量使用name属性.
Bean元素进阶
(1)scope元素
<1> singleton(默认值):单例对象 被表示为单例的对象在spring容器中只会存在一个实例
<2> prototype:多例原型.被标识为多例的对象,每次再获得才会创建.每次创建都是新的对象.整合struts2时,ActionBean必须配置为多例的.
<3> request:web环境下.对象与request生命周期一致.
<4> session:web环境下,对象与session生命周期一致.
(2)生命周期属性:
init-method:配置一个方法作为生命周期初始化方法.spring会在对象创建之后立即调用.
destory-method:配置一个方法作为生命周期的销毁方法.spring容器在关闭并销毁所有容器中的对象之前调用.
destory-method
init-method
spring创建对象的方式
spring的分模块配置
<!-- 导入其他spring配置文件 -->
<import resource="com/wst/demo/applicationContext.xml"/>
三、spring属性注入
注入方式
set方式注入
<bean name="user" class="com.wst.bean.User">
<!-- 为User对象中名为name的属性注入wst作为值 -->
<property name="name" value="wst"></property>
<property name="age" value="20"></property>
</bean>
构造函数注入
name:构造函数的参数名
index 构造函数的参数索引
type:构造函数的参数类型
<bean name="user2" class="com.wst.bean.User">
<constructor-arg name="name" value="tom" index="1"></constructor-arg>
<constructor-arg name="car" ref="car" index="0"></constructor-arg>
</bean>
p名称空间注入
1 导入p名称空间
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
==> xmlns:p="http://www.springframework.org/schema/p"
2 使用p属性完成注入
|-值类型: p:属性名="值"
|-对象类型 p:属性名-ref="bean名称"
<bean name="user3" class="com.wst.bean.User" p:name="jack" p:age="18" p:car-ref="hourse"></bean>
spel注入
SPEL注入:Spring Expression Language ,Spring表达式语言
value="#{}"
<bean name="user4" class="com.wst.bean.User">
<property name="name" value="#{user.name}"></property>
<property name="age" value="#{user3.age}"></property>
<property name="hourse" ref="hourse"></property>
</bean>
复杂类型注入
数组 List Map Properties
<!-- array注入 -->
<bean name="cb" class="com.wst.c_injection.CollectionBean">
<!-- 如果数组 只准备一个值(对象) 直接使用value|ref即可-->
<!-- <property name="arr" value="tom"></property> -->
<!-- array注入 多元素注入-->
<property name="arr">
<array>
<value>tom</value>
<value>jerry1</value>
<ref bean="user4"/>
</array>
</property>
<!-- 如果数据中只准备注入一个值(对象) 直接使用value|ref即可 -->
<property name="list">
<list>
<value>jack</value>
<value>rose</value>
<ref bean="user3"/>
</list>
</property>
<!-- map类注入 -->
<property name="map">
<map>
<entry key="url" value="jdbc:mysql:///crm"></entry>
<entry key="user4" value-ref="user4"></entry>
<entry key-ref="user3" value-ref="user2"></entry>
</map>
</property>
<!-- properties类型注入 -->
<property name="prop">
<props>
<prop key="driverClass">com.jdbc.mysql.Driver</prop>
<prop key="username">root</prop>
<prop key="password">root</prop>
</props>
</property>
</bean>