Spring概述
Spring是一个分层的 JavaSE/JavaEE 一站式(full-stack)轻量级开源框架。
Spring的优势
-
方便解耦,简化开发
-
AOP编程的支持
-
声明式事务的支持 编码式事务 转账 transfer方法手动植入进入 销户 DeleteAccount 事务支持
提前在Spring的主配置文件/注解中applicationContext.xml去配置transfer deleteAccount
-
方便程序的测试 Spring集成Junit
-
方便集成各种优秀的框架 Jfinal、Mybatis Struts2 Hibernate...
-
框架中的源码是需要借助学习的,经典的设计思想。设计模式....优秀的案例.....
Spring Framework的体系架构
schema讲解
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans"
"http://www.springframework.org/schema/beans/spring-beans.xsd"
"http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
">
配置约束的目的是为了在xml文件中进行配置的时候,能够按照提前约定好的约束进行标签的检验。
xml ns--->namespace 命名空间
一般配置一个xml文件最多只能有一个匿名的命名空间
对于Spring框架来说,它把匿名的命名空间给beans使用了 。如果需要配置的话,xmlns:aa
那么当使用beans中的标签的时候,需要在aa:bean
因为我们要使用bean的约束,xml整体的约束采用schema约束,所以我们配置schema约束地址,
schemaLocation 约束方式采用key-value键值对的方式,
schemaLocation 约束依赖于http://www.w3.org/2001/XMLSchema-instance
所以xml配置首先http://www.w3.org/2001/XMLSchema-instance给他起了个别名 别名的名字叫xsi
IOC控制反转
Inversion Of Control 控制反转,将对象的创建权交给了Spring,提前在Spring容器把该对象信息构建好,我们可以通过Spring容器调用getBean("name属性或者id属性")获取到对应的对象。
-
ApplicationContext,使用它需要借助于它的实现类ClassPathXmlApplicationContext,默认会在创建的时候,将内部配置的所有对象全部加载到Spring容器中
-
ClassPathXmlApplicationContext,将来我们可以从classpath的目录下加载到Spring主配置文件。
bean元素的配置和创建
凡是交给Spring容器管理的对象,都可以通过bean元素进行配置。
【Spring的本质就是对象管理容器】
name属性和class属性
-
name属性:作用就是给创建的对象起一个名字,将来在应用中通估这个名字获取到这个对象
-
class属性:创建该对象映射的那个类 反射机制 类名 = 包名+类名
-
id属性: id属性和name属性的作用是一样的,name属性的名称值可以重复,但是id值不允许重复,唯一
id属性值不能含有特殊字符,但是在使用中,一般把name属性值在容器的设置也是唯一的。
bean元素的创建
bean元素的创建默认采用空参构造方法创建对象。如果没有空参构造,那么一般就会报错。
-
空参构造方法创建
<bean id="user" class="com.zhiyou100.pojo.User"></bean>
-
静态工厂方式创建
<bean id="userStatic" class="com.zhiyou100.pojo.BeanFactory" factory-method="getStaticBean"></bean>
-
实例工厂方式创建
<bean name = "UserBeanFactory" class="com.zhiyou100.pojo.BeanFactory"></bean>
<bean name = "userFactory" factory-bean="UserBeanFactory" factory-method="getUser"></bean>
scope属性
scope 范围 指的设置bean元素创建对象的方式
-
singleton: 单例模式,当前的对象在容器中只会创建一次,容器只会保存该类的一个对象 默认采用的是单例模式
Spring认为一个bean就应该有且仅有一个对象
-
prototype :多例模式,当前对象在容器中每次调用getBean返回的都是新对象。
在Structs2容器中,采用的是多例模式。每一个action都要配置成prototype
-
request 请求域中
-
session 会话 在服务器中
-
globalSession 全局的,跨session存储的
bean元素的生命周期
生命周期 : 从生到死。从创建到消亡
-
init-method:初始化方法 初始化bean对象
init-method bean对应的空参构造方法
-
destroy-method:销毁方法 当对象销毁的时候,会执行该方法。
-
第一种情况,就是这个对象长期不用,GC就认为它是一个垃圾,GC就会清除掉
-
第二种情况,当这个容器销毁/关闭的时候,存储在该容器中的bean对象也会销毁。
-
-
bean元素默认是交给Spring管理的。但是如果你把该bean元素的scope属性设置为多例模式,那么Spring只管生,不管死。在单例模式下,Spring管理bean元素的整个生命周期。
依赖注入DI
DI Dependency Injection 依赖注入 ,有IOC环境的支持,Spring创建这个类的过程中,Spring将类的依赖的属性设置进去。
注入方式
如果是基本类型(String),则使用value,如果是引用类型使用ref
-
set方法注入
该对象对应的类中必须有set方法,否则无法正常注入。
<bean id="user" class="com.lk.pojo.User">
<property name="id" value="1"/>
<property name="username" value="若思"/>
<property name="gender" value="false"/>
<property name="birthday" ref="date"/>
<property name="role" ref="role"/>
</bean>
<bean id="date" class="java.util.Date"/>
-
构造方法注入
<bean id="user3" class="com.lk.pojo.User">
<constructor-arg name="id" value="3" type="java.lang.Integer" index="0"/>
<constructor-arg name="username" value="若楠" type="java.lang.String" index="1"/>
<constructor-arg name="gender" value="false" type="java.lang.Boolean" index="2"/>
<constructor-arg name="birthday" ref="date" type="java.util.Date" index="3"/>
<constructor-arg name="role" ref="role" type="com.lk.pojo.Role" index="4"/>
</bean>
-
p名称空间注入
<bean id="user2" class="com.lk.pojo.User" p:id = "2"
p:birthday-ref="date" p:username="若涵" p:gender="false"/>
-
Spel 表达式注入
<bean name="user4" class="com.lk.pojo.User">
<property name="id" value="#{role.id == 1 ? 4 : 5}" />
<property name="username" value="#{user.username.equals('阿南') ? '安安' : '囡囡'}"/>
......
</bean>
-
复杂类型注入【数组集合 List Set Map】