Spring简介
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Spring简介
什么是Spring?
spring是分层的avaSE以及javaEE应⽤于全栈的轻量级开源框架,以IOC(Inverse Of Control)控制反转,AOP(Aspect Oriented Programing)⾯向切⾯编程为核⼼,提供表现层SpringMVC以及持久层Spring,并且可整合多种其他开源框架。
spring的本质是管理对象,包括创建对象及维护对象之间的关系。
spring的优点
1)⽅便解耦,简化开发
通过spring的IOC可将对象的创建,以及对象之间的依赖都交由spring容器来进⾏管理,这样可以降低程序之间的耦合。
并且开发时也只需关注上层的应⽤,不⽤再多关注底层的应⽤。
2)AOP编程的⽀持
spring⽀持AOP⾯向切⾯编程,许多OOP⾯向对象编程不能或很难实现的功能,都可通过AOP轻松实现。
3)声明式事务的⽀持
可以将我们从单调烦闷的事务管理中解放出来,通过声明式事务的⽅式,可以灵活的进⾏事务管理,进⽽提⾼开发的质量和效率。
4)⽅便程序的测试
可以⽤⾮容器依赖的编程⽅式进⾏⼏乎所有的测试⼯作,测试不再是昂贵的操作,⽽是随⼿可做的事情。
5)⽅便集成各种优秀的框架
Spring可以降低各种框架的使⽤难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接⽀持。
6)降低javaEE的API的使⽤难度
Spring对 JavaEE API(如 JDBC、JavaMail、远程调⽤等)进⾏了薄薄的封装层,使这些API 的使⽤难度⼤为降低。
7)spring框架的源码是经典学习的案例
Spring的源代码设计精妙、结构清晰、匠⼼独⽤,处处体现着⼤师对Java设计模式灵活运⽤以及对 Java技术的⾼深造诣。
它的源代码⽆疑是Java技术的最佳实践的范例。
通过Spring进⾏解耦
什么叫程序的耦合?
在程序中,对象之间相互依赖,相互传递数据,这种相互关联的程度越⾼,程序的耦合度就越⾼。
程序的耦合度越⾼,维护的成本就越⾼。
⼯⼚模式解耦介绍
在实际开发中可以将分层的对象都配置到配置⽂件中,当需要这些对象时可以通过⼯⼚加载配置⽂件创建出这些对象,在接下来需要使⽤的时候,直接拿过来使⽤就可以了。
可以通过⼯⼚+接⼝+配置⽂件的⽅式来解除程序间的耦合
Spring IOC控制反转
IOC(Inverse Of Control),将创建对象的权⼒交给Spring框架,即将对象的创建,存储,管理都交给spring容器进⾏管理。
spring容器是spring的⼀个核⼼模块,⽤来管理对象,底层可理解为⼀个map
Bean对象的单例(Singleton)和多例(prototype)
在Spring容器中管理Bean对象的作⽤域,可通过bean对象的scope属性来进⾏配置,通常⽤的是singleton和prototype两种。
1)singleton,单实例,是默认值,这个作⽤域标识的对象具有全局唯⼀性。
当⼀个bean的作⽤域被设置为singleton时,spring容器在全局只会为该bean创建⼀个实例,
这个单⼀实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的请求都会返回唯⼀的这⼀个实例。
singleton负责实例的创建,初始化,销毁
2)prototype,多实例,这个作⽤域标识的对象,每次获取时都会创建⼀个新的对象
当⼀个bean的作⽤域被标识为prototype时,每次请求,spring容器都会为该bean创建⼀个新的实例。
prototype负责实例的创建,初始化,不负责销毁
Spring DI依赖注⼊
DI(dependency injection),依赖注⼊,通常有两种不同的⽅式set⽅式注⼊和构造⽅式注⼊
依赖注⼊,即组件之间的依赖关系由容器在应⽤运⾏期间决定,即由容器在应⽤运⾏期间动态的将实例对象注⼊到所需依赖的组件中。
简⽽⾔之,依赖注⼊就是在创建对象同创建对象之后,动态的为对象属性赋值。
set⽅式注⼊
1)普通属性注⼊
⽰例:
创建需要赋值的对象
package com.tedu.spring;
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
<!-- 声明User类的bean实例 -->
<bean id="user" class="er">
<!-- 通过set⽅式为普通属性赋值 -->
<property name="name" value="韩少云"></property>
<property name="age" value="20"></property>
</bean>
通过上述的⽅式就可以为对象的普通属性赋值。
注意:property标签中的name属性值,必须为对象中set⽅法名字,去掉set后第⼀个字母⼩写的名字。
例如:setUser()⽅法,它的name就应该为user
普通属性就可以通过value直接赋值
2)对象属性注⼊
代码⽰例:
public class User {
...
private UserInfo userInfo;
public UserInfo getUserInfo() {
return userInfo;
}
public void setUserInfo(UserInfo userInfo) {
erInfo = userInfo;
}
...
public String toString() {
return "User [name=" + name + ", age=" + age + ", userInfo=" + userInfo + "]";
}
}
在applicationContext.xml中
<!-- 声明User类的bean实例 -->
<bean id="user" class="er">
<!-- 通过set⽅式为普通属性赋值 -->
<property name="name" value="韩少云"></property>
<property name="age" value="20"></property>
<!-- 通过set⽅式为对象属性赋值 -->
<property name="userInfo" ref="userInfo"></property>
</bean>
由于此处是将userInfo对象注⼊,所以ref的值为userInfo对象对应的bean的id,name与上述规则⼀致
对象通过ref注⼊
构造⽅法注⼊
代码⽰例:
//声明⽆参构造函数
public User() {
}
//声明有参构造函数
public User(String name, Integer age, UserInfo userInfo) {
super();
= name;
this.age = age;
erInfo = userInfo;
}
applicationContext.xml⽂件
<bean id="user" class="er">
<!-- 通过set⽅式为普通属性赋值
<property name="name" value="韩少云"></property>
<property name="age" value="20"></property>
<property name="userInfo" ref="userInfo"></property>
-->
<!-- 通过构造器中参数为属性赋值 -->
<constructor-arg name="name" value="马云"></constructor-arg>
<constructor-arg name="age" value="35"></constructor-arg>
<constructor-arg name="userInfo" ref="userInfo"></constructor-arg>
</bean>
<!-- 声明UserInfo类的bean实例 -->
<bean id="userInfo" class="erInfo"></bean>
其中constructor-arg的name值与构造⽅法中的⼊参保持⼀致普通属性通过value赋值
对象属性通过ref赋值。