spring学习 -----spring的概念及ioc xml配置
首先上一张目前流行框架ssm各个部分功能交互及职责图。
首先按下面流程了解spring
1、spring的概述
1.1spring是什么
*是分层的JavaSe/EE应用full-stack轻量级开源框架,以Ioc(反转控制)和Aop(面向切面编程)为内核,提供了展现层SpringMVC和持久层Spring Jdbc以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库.
1.2spring的两大核心
IOC (控制反转) Aop(面向切面编程)
1.3spring的发展历程和优势
*优势:
1、方便解耦、优化开发
通过Spring提供的IOC容器,可以将对象间的依赖关系交友Spring进行控制,避免了硬盘编码所造成的过度程序耦合,用 户也不必再为单例模式类、属性问及那解析等这些很底层的需求编写代码,可以更专注与上层应用。
2、AOp编码支持
通过Spring的Aop功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过Aop轻松应付
3、声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明方式灵活的进行事务管理,提高开发效率和质量。
4、方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
5、方便集成各种优秀框架
Spring可以降低各种框架的使用难度,提供了各种优秀的框架(struts、Hibernate、Hessian)的直接支持
6、降低javaEE ApI的使用难度
Spring对JavaEE ApI(如JDBC、javaMail、远程调用等)进行了薄薄的封装层,使这些API的使用难度大为降低
spring的体系结构
2、程序的耦合以及解耦
工厂模式解耦
3、IOC概念和spring中的IOC
spring中基于XML的IOC环境搭建
4、依赖注入(Dependency Injection)
首先按上述步骤先了解单例和多例的概念:
第二了解工厂模式解耦图解:
解耦概念:
App -->资源 App-->工厂-->资源
1~1、ioc控制反转
*将程序直接指向资源,到程序指向BeanFactory/ApplicationContext工厂再指向资源
ApplicationContext的常用实现类:
*classpathXMLApplicationContext:它可以加载类路径下的配置文件,如果不再类路径下就无法加载
*FileSystemXMLApplicateContext:他可以加载磁盘任意路径下的文件,前提是要有访问权限
*AnnocationConfigApplicateContetx:它用于注解实现配置文件
核心容器ApplicationContext和BeanFacotory的区别?
*ApplicationContext(实际开发用的多):作为核心容器时,是采用立即加载的方式,就是说读取完配置文件马上就会创建配置文件的对象(单例模式适用,用之前就创建了,只有一个对象就不会产生线程安全问题)
*BeanFacotory:作为核心容器时,采用延迟加载的方式,读取完配置文件后不会立即创建对象,而是什么时候根据id获取对象时就创建对象(多例模式适用,在使用时创建,要多少创建多少)
在使用spring时会导入spring的jar包,接下来简单介绍它导入的jjar包对应功能
spring-context
spring-core
spring-expression 这四个是核心容器
spring-beans
spring-jcl:是aparce日志文件集成
spring-aop:里面有两种 注解和配置文件(XML)两种实现方式
Bean:有可重用的组件意思
javaBean:用java语言编写的可重用组件
JavaBean>>实体类
spring对bean的管理:
1、创建bean的三种方式:
1.1<bean id="IAccountServiceImpl" class="com.cx.Spring.Service.IAccountServiceImpl"></bean>
*通过bean标签实现时,当bean标签里面只写了id和class属性时,这时会调用默认构造函数创建对象,如果默认构造函数被有参构造覆盖并且没有重写,就会报错。
1.2<bean id="factory_1" class="com.cx.Spring.factory.factory_1"></bean>
<bean id="IAccountServiceImpl" factory-bean="factory_1" factory-method="getInstance"></bean>
*当类存在jar包中,我们无法获取到他是否存在默认的构造函数时就使用此方式创建bean。
通过工厂的方法创建对象,或者说使用某个类中的方法创建对象存入spring容器中
1.3<bean id="IAccountServiceImpl1" class="com.cx.Spring.factory.factory_2" factory- method="getInstance"></bean>
*这和1.2一样是通过工厂类加载对象,不同的是产生对象的方法是静态的,所以这个会优先加载,所以直接通过全限定类名获取到类在通过方法获取内容。
2、bean的作用范围:
bean标签的scope属性:
用于指定bean标签的作用范围:
singleton:单例的(默认):
<bean id="IAccountServiceImpl2" class="com.cx.Spring.Service.IAccountServiceImpl" scope="singleton">
prototype:多例的
<bean id="IAccountServiceImpl2" class="com.cx.Spring.Service.IAccountServiceImpl" scope="prototype">
session:作用域web应用的会话范围
<bean id="IAccountServiceImpl2" class="com.cx.Spring.Service.IAccountServiceImpl" scope="session">
request:作用与web应用的请求范围
<bean id="IAccountServiceImpl2" class="com.cx.Spring.Service.IAccountServiceImpl" scope="request">
globle-session:作用与集群环境的会话范围,当他不是集群时他就是session,全局session
<bean id="IAccountServiceImpl2" class="com.cx.Spring.Service.IAccountServiceImpl" scope="globle-session">
全局session介绍
3、bean的生命周期:
单例模式:
出生:随着容器一起被创建
init-method="创建的方法名"//创建
活着:容器被创建后一起留存
死亡:容器被销毁,也被销毁
destory-method="销毁的方法名"//销毁
总结:容器在,它就在
多例模式:
出生:配置文件一读取完就会被创建,
活着:对象一直被使用就会一直存在
死亡:这里spring不知道什么时候销毁,所有不会轻易删除,所以等垃圾回收机制删除
4、Spring中的依赖注入(参数赋值):Dependency Injection
IOC的作用:降低程序间的依赖关系(耦合)
依赖注入的引入:对于程序间的依赖关系,以后都交由spring来处理,创建类时所需要的其他对象,都由spring来提供,我们只需要在配置文件中声明。
依赖关系的维护就是叫依赖注入
能够注入的类型:
基本数据类型和String类型
前面配置过的bean类型
复杂或集合类型:<!-- set注入实现注入数组/集合等复杂类型 -->
注入方式;
1、通过注解注入
2、通过构造函数注入:
<!-- 通过构造方法注入
bean标签里有一个constructor标签,当构造方法参数为有参而没有提供无参的构造时
标签中的属性:
type:用于指定要注入的数据类型,也是构造方法中的某个或某些参数
index:用于指定要注入给构造函数的位置,下标为0
name:用于指定要注入数据类型在构造函数中的名称(常用)
+++++++++++++++用于找到构造函数中的要被注入的参数+++++++++++++++++++
value:用于基本数据类型和String数据类型的指定
ref:用于引用关联的bean对象-->
优势:当注入数据时,注入数据必须和构造参数一致,用户无法干预
缺点:这些数据用不用都必须提供
<bean id="IAccountServiceImpl" class="com.cx.Spring.Service.IAccountServiceImpl">
<constructor-arg name="id" value="18"></constructor-arg>
<constructor-arg name="name" value="扎扎"> </constructor-arg>
<constructor-arg name="date" ref="date1"></constructor-arg>
</bean>
<!-- 创建一个bean对象 -->
<bean id="date1" class="java.util.Date"></bean>
3、通过set方法注入:
<!-- 通过set方法注入 (常用)
bean标签里有一个property标签,用类中的set方法注入值
标签中的属性:
name:用于指定要注入参数的set那个属性
+++++++++++++++用于找到构造函数中的要被注入的参数+++++++++++++++++++
value:用于基本数据类型和String数据类型的指定
ref:用于引用关联的bean对象-->
优势:创建对象没有明确的限制,可以直接使用默认构造函数
缺点:当某个参数必须有值时,无法保证都已经调用了set方法
<!-- 创建一个bean对象指定date类型的bean -->
<bean id="date1" class="java.util.Date"></bean>
<bean id="IAccountServiceImpl" class="com.cx.Spring.Service.IAccountServiceImpl1">
<property name="id" value="id"></property>
<property name="name" value="name"></property>
<property name="date" ref="date1"></property>
</bean>
复杂或集合类型:<!-- set注入实现注入数组/集合等复杂类型 -->
<bean id="IAccountServiceImpl2" class="com.cx.Spring.Service.IAccountServiceImpl2">
<!-- 注入的数组类型 -->
<property name="array">
<array>
<value>AAA</value>
<value>BBB</value>
</array>
</property>
<!-- 注入集合类型 -->
<property name="arrayList">
<list>
<value>AAA</value>
<value>BBB</value>
</list>
</property>
<property name="list">
<list>
<value>AAA</value>
<value>BBB</value>
</list>
</property>
<property name="map">
<map>
<!--设置值的方法二-->
<entry key="AAA" value="BBB"></entry>
<!--设置的方法一-->
<entry key="CCC">
<value>BBB</value>
</entry>
</map>
</property>
<property name="properties">
<props>
<prop key="AAA">
AAA
</prop>
<prop key="BBB">
BBB
</prop>
</props>
</property>
总结:
List数组集合:
可用标签array 、list、set
Map键值对集合:
可用标签props、map