什么是Spring?
Spring是一个轻量级的开源框架,它是为简化企业级应用开发而生,使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能。
Spring有哪些优点?
-
方便解耦, 简化开发
Spring是个大工厂,可以将所有对象创建以及对象间依赖关系的维护,交给Spring容器进行管理,避免硬编码造成过度的程序耦合,实现程序各层之间的解耦。 -
AOP编程的支持
Spring提供面向切面编程(将日志记录、权限控制、性能统计等服务理解成一个切面),可以将日志、权限等服务从业务逻辑中分离出来,可以方便的实现对程序进行权限拦截、运行监控等功能。 -
声明式事务支持
Spring只需通过配置就可以完成对事务的管理,无需手动编程,大大提高了开发的效率。 -
方便集成各种优秀框架
Spring不排斥各种优秀开源框架,其内部提供了对各种优秀框架(如 : Struts、Hibernate、MyBatis等. . .)的直接支持。 -
方便程序的测试
Spring对Junit4支持,可以通过注解的方式来测试Spring程序 -
降低JavaEE API的使用难度
Spring对JavaEE开发中一些非常难用的API(JDBC、JavaMail、远程调用等. . .)都提供了封装,使这些API的使用难度大大降低。
Spring的核心:控制反转IoC 和 依赖注入DI 的概念?
-
IoC(Inverse of Control)反转控制,就是将原本在程序中手动创建类对象的控制权,交由Spring框架管理。
-
DI(Dependency Injection)依赖注入,就是在Spring创建某个对象的过程中,将这个对象所依赖的属性(变量或其它类对象)注入进去。
控制反转(IoC)
-
控制反转,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(DI)
-
Spring核心是一个IoC容器(管理Bean),而IoC的关键就是BeanFactory工厂,它会代替我们创建bean,然后使用getBean来获取,而不是自己去new,就是工厂模式的体现。而这个工厂之所以能够创建这个bean,就是因为它读取了我们传入的配置文件,根据配置信息利用反射创建了对应类的实例。
-
IoC的实现可以看做是反射+配置文件+工厂。反射和工厂是Spring内部帮我们封装实现好的。我们只需要使用配置文件进行配置即可
Spring IOC快速入门案例流程:
-
下载Spring所需基本jar包
-
复制Spring开发jar包到项目工程中
-
编写Spring核心配置文件spring.xml
-
在程序中读取Spring 配置文件,通过Spring框架获得Bean,完成相应的操作
在上面是我们的开发流程,我们第一步一般都是导入所需jar包,但由于刚开始时根本不知道该在什么时候用到哪些jar包,所以这里事先不导入jar包,而是在开发过程中,报错提示缺少哪些jar时,在依次导入
File --→
New --→
Project
选择Spring
,然后再 Libraries 下选择set up library later
- Use library : 如果你已下载好了jar包,可选择该项,然后点击Create . .选择导入所需的jar
- Download :如果你没有下载好所需jar,可选择该选项下载Spring所需的部分jar,并且它还会自动给你创建一个applicationContext.xml配置文件
- set up library later :如果你想在创建好项目后在自己手动导入jar,那么可以选择该选项
编辑项目名称,并选择项目所在路径
创建好的项目结构如下
在 src 下创建com.CD4356.ioc
包,在包中创建Student
类
Student类
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "我叫:"+this.name+",今年:"+this.age+"岁了...";
}
}
src → New → XML Configuration File → Spring config 创建Spring的配置文件
不对啊,为什么没有Spring config选项,是不是出什么问题了
原来Spring config是依赖于spring-beans-4.3.22.RELEASE.jar
产生的,而我们还没有导入该jar包,所以找不到Spring config选项
在SpringIoCDemo
项目下,新建lib
文件夹,然后到maven中央仓库中下载spring-beans-4.3.22.RELEASE.jar
导入lib文件夹中,选择Add as Library
将jar包放在classpath路径下
继续 src → New → XML Configuration File → Spring config 创建Spring的xml配置文件,文件名为applicationContext
(文件名可任意)
发现导入spring-beans-4.3.22.RELEASE.jar
后,可以找到Spring config
选项了
创建好的applicationContext.xml文件如下所示,这些内容是自动生成的,我们还没有开始编辑该文件
编辑applicationContext.xml配置文件,内容如下
在src下创建一个测试类,名为SpringApplication
然后在编写加载XML配置文件代码时报错了,那么这是个什么错误呢?
因为ApplicationContext类
位于spring-context-4.3.22.RELEASE.jar
包中,而我们的项目中还没有带入该jar包,所以这里需要我们导入该jar包
解决ApplicationContext
报红后,ClassPathXmlApplicationContext
又报红了
spring-beans-4.3.22.RELEASE.jar
外部依赖spring-core-4.3.22.RELEASE.jar
,没有导入spring-core-4.3.22.RELEASE.jar包,无法找到xml配置文件
所以导入spring-core-4.3.22.RELEASE.jar
后可解决文题
ok,完成下面代码后,点击main函数左边的绿色三角标运行项目
哈哈!又报错了
缺少commons-logging-1.2.jar
包,以后如果遇到java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
,一般都是缺少jar包导致的( 当然也可能是找不到自定义类 )
复制org.apache.commons.logging mvn
到百度中(mvn即maven仓库
),进入maven仓库中找,下载导入项目中
又报错了
缺少spring-expression-4.3.22.RELEASE.jar
包
百度org.springframework.expression mvn
,下载spring-expression-4.3.22.RELEASE.jar
包
终于运行成功了
【由上面的内容可以看出,实现一个简单的Spring IoC示例至少需要用到5个jar(4个核心jar + 1个第三方日志jar
)包】
spring-context-4.3.18.RELEASE.jar
spring-beans-4.3.18.RELEASE.jar
spring-core-4.3.18.RELEASE.jar
spring-expression-4.3.18.RELEASE.jar
commons-logging-1.2.jar
【Spring配置文件】
Spring配置文件是用于指导Spring工厂进行Bean生产、依赖关系注入(装配)及Bean实例分发的图纸
。
容器默认到类路径下加载Spring配置文件,如果配置文件放在src的下一级目录下,则需要在ClassPathXmlApplicationContext(String configLocation)
中指定src下的存放路径
/**
* 在src目录下,新建一个spring包来存放applicationContext.xml
*/
ApplicationContext context=new
ClassPathXmlApplicationContext("spring/applicationContext.xml");
在一些大型项目中,会有多个配置文件,我们可以在ClassPathXmlApplicationContext()
方法中同时加载多个Spring配置文件
ApplicationContext context=new
ClassPathXmlApplicationContext(new String[]{"spring/applicationContext.xml",
"spring/spring-config.xml",...,"spring/spring-config5.xml"});
其中ApplicationContext.xml是Spring的默认配置文件,当容器启动时找不到指定的配置文档时,将会尝试加载这个默认的配置文件。
【Spring配置文件中的<bean>
标签】
一个用来描述一个对象,id是唯一标识(根据id识别具体的Bean
),class表示该类的具体java文件(全类名
)
因为spring IoC是一个容器,我们在Spring配置文件中添加对类的描述
在我们加载IOC容器后,Spring就会全自动的为我们创建相应的对象
此时我们就无需再自己new创建对象了,而是直接通过getBean("bean标签中id的属性值"
)获取即可
这就是所谓的控制反转
,将创建对象的权限反转给Spring IoC容器,对类之间的关系进行了解耦,而这一切都离不开Spring配置文件中使用的标签
所以Spring IoC容器会帮我们做两件事:1. 创建对象 2. 为属性赋值
【Bean工厂的ApplicationContext】
Spring IoC设计的核心是Bean容器
BeanFactory采用了java经典的工厂模式,通过从xml配置文件中读取javaBean的定义,来实现javaBean的创建、配置和管理bean与bean之间的依赖关系,所以BeanFactory可以称为IoC容器
。
ApplicationContext的中文含义是: 应用上下文
,继承自BeanFactory接口,它除了包含BeanFactory的所有功能之外,还在国际化支持、资源访问(如URL和文件)、事件传播等方面进行了良好的支持,使之成为Java EE应用放中首选的IoC容器
,可应用于Java APP和Java Web中。
BeanFactory 和 ApplicationContext 的不同之处
- BeanFactory容器实例化后并不会自动实例化bean,只有当bean被使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配
- ApplicationContext容器实例化后会自动对所有的单实例bean进行实例化与依赖关系的装配,使之处于待用状态