spring
1. spring 简介
Spring 框架,由Rod Johnson 开发
Spring 是一个非常流行的开源框架,基于IOC和AOP来架构多层JavaEE系统,以帮助分离项目组件之间的依赖关系
它的主要目的是简化企业开发
spring 解决的问题
解耦:为了简化开发:Spring 是一个Bean 容器,可以将所以对象的创建和依赖关系维护,交给Spring管理。
aop编程支持:AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截,运行监控等功能。
声明式事务支持@Transactional
:只需要通过配置就可以完成对事务的管理,而无需手动编程。
方便集成各种优秀的框架:Spring 不排斥各种优秀的 开源框架,其内部提供了对各种框架(如:Struts Hibernate Mybatis Quartz)的直接支持。
降低JavaEE API 的使用难度:Spring 对JavaEE 开发中非常难用的API(JDBC JavaMail 远程调用),都提供封装, 是这些API 应用难度大大降低。
2. spring模块简介
- Spring的组成
Spring 框架包含的功能大约由20个模块组成。这些模块按组可分为核心容器,数据访问,Web,AOP(面向切面编程),设备,消息和测试。
- Spring-Core
包含Spring 框架的核心工具类,Spring其他的组件都要使用这个包的类,是其他组件的基本核心。 - Spring-beans
包含访问配置文件、创建和管理Bean以及 Inversion of Control / Dependency InJection( IOC/DI)操作相关的所有 类。如果只需要基本的IOC/DI支持,引入spring-core 和 spring-beans 即可。 - Spring-context
为spring 核心提供了大量扩展,这样使得由core 和 beans 提供的基础功能增强,意味着spring工程能以框架模式访 问对象。context 模块继承了beans 模块的特性并增加了对国际化,事件传播,资源加载 和透明化。同时也支持 JavaEE特性,如EJB,JMX 和基本的远程访问。Context模块的关键是ApplicationContext 接口。spring-contextsupport则提供了第三方库集成到spring-context的支持,比如缓存(Ehcache,Guava,JCache)、邮件 (JavaMail)、调度(commmonJ,Quartz)、模板引擎(FreeMarker,JasperReports,Velocity)等。 - Spring-expression
为在运行时查询和操作对象图提供了强大的表达式语言。它是JSP2.1规范中定义的统一表达式语言的扩展,支持set 和get属性值、方法调用、访问数组集合及索引的内容、逻辑算数运算、命名变量、通过名字从SpringIOC容器中检索 对象,还支持列表的投影,选择以及聚合等。
3. spring核心特性
- 控制反转(IOC)
IOC是 inverse of Control的简写,意思是控制反转。是降低对象之间的耦合关系的设计思想,通过IOC开发人员不需要 关心对象的创建过程,交给 Spring容器完成。具体的过程是,程序读取Spring配置文件,获取需要创建的bean对象, 通过 反射机制创建对象的实例。缺点:对象是通过反射机制实例化出来的,因此对系统的性能有一定的影响。将对象的创建 权利反转给 Spring容器 - 依赖注入(DI)
Dependency Injection,说的是创建对象实例时,同时为这个对象注入它所依赖的属性。相当于把每个bean与bean之 间的关系交给容器管理。而这个容器就是 spring.例如我们通常在 Service层注入它所依赖的Dao层的实例;在 Controller层注入 Service层的实例 - IOC和DI
DI是IOC的别名2004年, Martin Fowler探讨了同一个问题,既然IoC是控制反转,那么到底是哪些方面的控制被反转了 呢?“,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了控制被反转之后,获得依赖对象的过程由自 身管理对象变为由IoC容器主动注入。于是,他给控制反转取了一个更合适的名字叫做依赖注入( Dependency Injection,DI)"。他的这个答案,实际上给出了实现IOC的方法,就是依赖注入。所谓依赖注入,就是由IoC容器在运行期间, 动态地将某种依赖关系注入到对象之中所以,依赖注入(DI)和控制反转(IoC)是从不同的角度描述的同一件事情,就是指 通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦
4 spring实战
pom.xml
<dependecy>
<groupId>org.springframework</groupId> //组织机构名,一般格式为域名.机构名
<artifactId>spring-context</artifactId> //项目唯一标识符
<version>5.1.5.RELEASE</version> //版本号
</dependecy>
Student.java
@Data public class Student {
private int id;
private String name;
private int age;
private String email;
}
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="student" class="com.qfedu.beans.Student">
<property name="id" value="10"/>
<property name="age" value="20"/>
<property name="email" value="10086@qq.com"/>
<property name="name" value="kangkang"/>
</bean> <
/beans>
AppTest.java
@Test public void test1(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
Object st = ctx.getBean("student");
System.out.println(st);
}
5 spring容器
BeanFactoy: 创建bean的工厂,也可视为一种容器(不建议使用)。
ApplicationContext: Spring 统一的容器接口,(官方推荐使用)。
AbstractXmlApplicationContext: 以XML方式实例化容器的抽象类
ClassPathXmlApplicationContext :子类:从类路径下加载xml配置文件。
FileSystemXmlApplicationContext:子类:从文件系统中加载xml配置文件。
6 Bean创建方式
- 构造器方式 (通过反射底层调用无参构造)
<bean class="pojo.Dog" name="dog" >
<property name="name" value="旺财"/>
<property name="age" value="20"/>
</bean>
- 静态工厂方式
public class DogFactory {
public static Dog createDog(){
Dog dog = new Dog();
dog.setName("张三");
dog.setAge(6);
return dog;
}
public Dog createDog2(){
Dog dog = new Dog();
dog.setName("李四");
dog.setAge(10);
return dog;
}
}
<bean name="dog3" class="pojo.DogFactory" factory-method="createDog" ></bean>
- 实例工厂方式
<!--1、创建工厂对象-->
<bean class="pojo.DogFactory" name="dogFactoryBean" />
<!--2、通过工厂实例调用成员方法 -->
<bean name="dog4" factory-bean="dogFactoryBean" factory-method="createDog2">
</bean>
7 Bean配置文件
- id name
id 和 name 命名bean对象 区别在于,id唯一的名字,name视为别名,可以有对个,使用 空格 逗号 分号分隔。 - alisas
别名还可以使用
<alias name="dog" alias="别名"/>
- class
class 用来指定类全名,spring底层是采用反射机制来创建对象的,所以需要提供类的信息。 - scope
prototype 多例模式
singleton 单例模式 - lazy-init:
赖加载特性,所加依赖需要时才创建对象 - depends-on
控制bean创建顺序 - init-method
bean创建时回调方法 - destroy-method
bean销毁时回调方法 - abstract与parent
抽象bean不能独立存在,必须要其他bean继承。
<bean name="absdog" abstract="true">
<property name="name" value="金宝2"/>
<property name="age" value="10"/>
</bean>
<bean name="d1" class="pojo.Dog" parent="absdog"></bean>
8 Spring 多配置文件
ApplicationContext ioc =
new ClassPathXmlApplicationContext("beans-one.xml","beans-two.xml");