1、Spring框架入门之Spring IOC(XML)& Bean工厂
1.1 什么是Spring框架?
Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式)轻量级开源框架。一站式框架是指有EE开发的每一层解决方案:
- WEB层:SpringMVC
- Service层:Spring的Bean管理,Spring声明式事务
- DAO层:Spring的JDBC模板,Spring的ORM模块
目前Spring有两个版本:Spring3.X 和 Spring4.X,这里我们将展开Spring4.X的学习。
1.2 为什么学习Spring框架?
1.3 如何学习Spring框架?
Spring框架下拥有9大模块,对于小白来讲还是从IOC来进行入门学习的。我们可以从Spring的官网:http://spring.io/来下载spring4.X的开发包,下载并解压后可以看到如下目录:
在spring-framework-4.2.4.RELEASE-dist目录下有全部的Spring文件:
- docs:Spring的开发文档和API
- libs:Spring的开发jar包
- schema:包含Spring的各种配置文件的约束
下面开始学习Spring 的IOC模块,加油骚年们!
1.3.1 什么是IOC?
Spring IOC就是Spring框架中底层的Core Container中的内容;IOC(inversion of control)控制反转,是将对象的创建权反转交给Spring来管理。在实际的开发中,如果底层的实现切换了,需要修改源代码?大部分的Demo都是需要的,这是因为代码模块之间的耦合度太高,有的甚至牵一发而动全身,显然这样的情景放在实际企业级开发中是非常糟糕的,为了实现不修改代码(低耦合性),在Spring框架中就引入了工厂+反射+配置文件的方法,利用工厂代理来降低代码模块之间的耦合性,如下图所示:
1.3.2 使用Spring IOC
创建web项目并引入对应IOC支持的jar包:
创建接口和实现多个实现类(便于测试):
public interface UserDao{
public void save();
}
public class UserDaoImpl1 implements UserDao{
public void save()
{
System.out.println(“UserDaoImpl1执行了。。。”);
}
}
public class UserDaoImpl2 implements UserDao{
public void save()
{
System.out.println(“UserDaoImpl2执行了。。。”);
}
}
创建applicationContext.xml文件:
参考spring的解压路径下spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html来编写applicationContext.xml文件
编写测试类:
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(“applicationContext.xml”);
UserDao userDao = (UserDao)applicationContext.getBean(UserDao.class);
userDao.save( );
引入Spring IOC后我们就可以通过更改applicationContext.xml文件中Bean的配置来切换userDao.save();实际调用的是实现类中的具体save方法。
1.3.3 IOC和DI
- IOC:控制反转,将对象的创建权反转给了Spring。
- DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
- 面向对象的时候
依赖
Class A{
}
Class B{
public void xxx(A a){
}
}
继承:is a(接口:like a)
Class A{
}
Class B extends A{
}
聚合:has a
1.3.4 Spring工厂类
Spring工厂类的结构图:
由图:
- BenaFactory(老版本的工厂):在调用getBean()时才生成类的实例。
- ApplicationContext(新版本的工厂):在加载配置文件时就将Sping管理的类实例化,ApplicationContext中有两个实现类:
- ClassPathXmlApplicationContext:加载类路径下的配置文件
- FileSystemXmlApplicationContext:加载系统路径下的配置文件
1.3.5 Bean配置
<bean>标签的id和name的配置
- id :使用了约束中的唯一约束。里面不能出现特殊字符的。
- name :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。
- Spring和Struts1框架整合的时候
- <bean name=”/user” class=””/>
Bean的生命周期的配置(了解)
- init-method :Bean被初始化的时候执行的方法
- destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭)
Bean的作用范围的配置(重点)
- scope :Bean的作用范围
- singleton :默认的,Spring会采用单例模式创建这个对象。
- prototype :多例模式。(Struts2和Spring整合一定会用到)
- request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
- session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
- globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
1.4 Spring的Bean管理(XML方式)
1.4.1 Spring的Bean的实例化方式(了解)
Bean已经都交给Spring管理,Spring创建这些类的时候,有几种方式:
无参构造方法的方式(默认)
编写类
编写配置
静态工厂实例化的方式
编写Bean2的静态工厂
配置
实例工厂实例化的方式
Bean3的实例工厂
配置
1.4.2 Spring的属性注入(重点)
1.构造方法的方式的属性注入
1.构造方法的属性注入
2.Set方法的方式的属性注入
Set方法的属性注入
Set方法设置对象类型的属性
3.P名称空间的属性注入(Spring2.5以后)
通过引入p名称空间完成属性的注入:
- 写法:
- 普通属性 p:属性名=”值”
- 对象属性 p:属性名-ref=”值”
- P名称空间的引入
- 使用p名称空间
4.SpEL的属性注入(Spring3.0以后)
- SpEL:Spring Expression Language,Spring的表达式语言。
- 语法:
- #{SpEL}
- 语法:
5.集合类型属性注入(了解)
配置
<!-- Spring的集合属性的注入============================ -->
<!-- 注入数组类型 -->
<bean id="collectionBean" class="com.itheima.spring.demo5.CollectionBean">
<!-- 数组类型 -->
<property name="arrs">
<list>
<value>王东</value>
<value>赵洪</value>
<value>李冠希</value>
</list>
</property>
<!-- 注入list集合 -->
<property name="list">
<list>
<value>李兵</value>
<value>赵如何</value>
<value>邓凤</value>
</list>
</property>
<!-- 注入set集合 -->
<property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<!-- 注入Map集合 -->
<property name="map">
<map>
<entry key="aaa" value="111"/>
<entry key="bbb" value="222"/>
<entry key="ccc" value="333"/>
</map>
</property>
</bean>
1.5 Spring分模块开发
在加载配置文件的时候加载多个:
ApplicationContxt applicationContext=new ClassPathXmlApplicationContext(“applicationContext.xml”,”applicationContext2.xml”);
在一个配置文件中引入多个配置文件:
谢谢阅读! -----知飞翀