spring简介
Spring 是一个开源框架,中文意思就是春天,也许是作者想让自己的这个框架给Java开发人员带来春天吧。其官方网站是 https://spring.io/ ,可以在官方网站下载到完整的类库,源代码以及文档。spring是一个高度灵活的轻量级框架,其目的是降低企业级应用开发的复杂度。
spring的特点
轻量级:Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API
容器:Spring 是一个容器, 因为它包含并且管理应用对象的生命周期
框架:Spring 实现了使用简单的组件配置组合成一个复杂的应用,在 Spring 中可以使用 XML 和 Java 注解组合这些对象
一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库 (实际上 Spring 自身也提供了展现层的 SpringMVC 和 持久层的 Spring JDBC)
依赖注入(DI --- dependency injection、IOC)
面向切面编程(AOP --- aspect oriented programming)
(个人认为依赖注入和面向切面变成是spring的核心,也是spring应用时需要主要学习的东西,我是小白,刚接触框架部分,希望有问题大家指出来,欢迎指教。)
(额,还有个声明式事务处理,这一块我还没有去学,学完再来改这个地方吧)
spring3.0和spring4.0的功能组建模块有所不同
spring3.0的主要结构只是7块(摘抄自Java程序员面试宝典)
模块 | 描述 |
Spring AOP | 切面编程的思想,使spring框架管理的对象支持AOP,同时这个模块也提供了事务管理,可以不依赖具体的EJB组建,就可以将事务管理集成到应用程序中 |
Spring ORM | 提供了对现有ORM框架的支持,例如Hibernate、JDO等 |
Spring DAO | 提供对数据库访问对象(DAO)模式和JDBC支持,DAO可以实现把业务逻辑与数据库访问的代码实现分离,降低代码耦合度。通过对JDBC的抽象,简化了开发工作,同时简化了对异常的处理(可以很好的针对不同数据库厂商抛出的异常)。 |
Spring Web | 提供了Servlet监听器的Context和Web应用的上下文。同时还集成了一些现有的Web框架,例如Structs |
Spring Context | 扩展核心容器,提供了Spring上下文环境,给开发人员提供了很多非常有用的服务,例如国际化、E-mail和JNDI访问等 |
Spring Web MVC | 提供了一个构建Web应用程序的MVC的实现 |
Spring Core | Spring框架核心容器,提供了Spring框架的基本功能。这模块最主要的组件为BeanFactory,它使用工厂模式来创建所需的对象。同时BeanFactory使用IOC思想,通过读取XML文件的方式来实例化对象,可以说BeanFactroy提供了组件生命周期管理,组件的创建、装配、销毁等功能。 |
spring4.0建立了灵活的可热插拔的组件结构,基础框架如下图
(原谅我会的真的很少,又在网上摘抄到的)
Spring核心容器
容器是Spring框架最核心的部分,它管理着Spring应用中bean的创建、配置和管理。在该模块中,包括了Spring bean工厂,它为Spring提供了DI(DI—Dependency Injection,即“依赖注入”)的功能。基于bean工厂,我们还会发现有多种Spring应用上下文的实现,每一种都提供了配置Spring的不同方式。除了bean工厂和应用上下文,该模块也提供了许多企业服务,例如E-mail、JNDI访问、EJB集成和调度。
所有的Spring模块都构建于核心容器之上。当你配置应用时,其实你隐式地使用了这些类。
Spring的AOP模块
在AOP模块中,Spring对面向切面编程提供了丰富的支持。这个模块是Spring应用系统中开发切面的基础。与DI一样,AOP可以帮助应用对象解耦。借助于AOP,可以将遍布系统的关注点(例如事务和安全)从它们所应用的对象中解耦出来。
数据访问与集成
使用JDBC编写代码通常会导致大量的样板式代码,例如获得数据库连接、创建语句、处理结果集到最后关闭数据库连接。Spring的JDBC和DAO(Data Access Object)模块抽象了这些样板式代码,使我们的数据库代码变得简单明了,还可以避免因为关闭数据库资源失败而引发的问题。该模块在多种数据库服务的错误信息之上构建了一个语义丰富的异常层,以后我们再也不需要解释那些隐晦专有的SQL错误信息了!
对于那些更喜欢ORM(Object-Relational Mapping)工具而不愿意直接使用JDBC的开发者,Spring提供了ORM模块。Spring的ORM模块建立在对DAO的支持之上,并为多个ORM框架提供了一种构建DAO的简便方式。Spring没有尝试去创建自己的ORM解决方案,而是对许多流行的ORM框架进行了集成,包括Hibernate、Java Persisternce API、Java Data Object和MyBatis。Spring的事务管理支持所有的ORM框架以及JDBC。
Web与远程调用
MVC(Model-View-Controller)模式是一种普遍被接受的构建Web应用的方法,它可以帮助用户将界面逻辑与应用逻辑分离。Java从来不缺少MVC框架,Apache的Struts、JSF、WebWork和Tapestry都是可选的最流行的MVC框架。
虽然Spring能够与多种流行的MVC框架进行集成,但它的Web和远程调用模块自带了一个强大的MVC框架,有助于在Web层提升应用的松耦合水平。
除了面向用户的Web应用,该模块还提供了多种构建与其他应用交互的远程调用方案。
Spring远程调用功能集成了RMI(Remote Method Invocation)、Hessian、Burlap、JAX-WS,
同时Spring还自带了一个远程调用框架:HTTP invoker。Spring还提供了暴露和使用REST API的良好支持。
Instrumentation
Spring的Instrumentation模块提供了为JVM添加代理(agent)的功能。具体来讲,它为Tomcat提供了一个织入代理,能够为Tomcat传递类文件,就像这些文件是被类加载器加载的一样。如果这听起来有点难以理解,不必对此过于担心。
测试
Spring提供了测试模块以致力于Spring应用的测试。
通过该模块,你会发现Spring为使用JNDI、Servlet和Portlet编写单元测试提供了一系列的mock对象实现。对于集成测试,该模块为加载Spring应用上下文中的bean集合以及与Spring上下文中的bean进行交互提供了支持。
控制反转与依赖注入
IOC (Inversion of Control) :控制反转,通过容器来控制对象的创建及维护,对象中成员变量的创建及维护。反转就是将对象的控制权转移给容器处理,目的是获得更好的扩展性和可维护性。用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中
官方下载spring4.x最新开发版本 https://repo.spring.io/release/org/springframework/spring/
控制反转需要导入的jar包
还需要下载commons-logging日志文件 commons-logging-1.1.1.jar
先写一个简单的类HelloService
package com.icss.spring.service.impl; import com.icss.spring.service.HelloService; public class HelloServiceImpl implements HelloService{ @Override public void sayHello() { System.out.println("hello"); } }
然后我们新建一个xml文件(在src目录下),配置spring的框架,记得build path哦!
* spring-framework-reference/html/目录下
* 找到xsd-config.html.引入beans约束
<?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"> <!-- 创建对象 id="对象名" class="类的完整路径"--> <bean id="helloService" class="com.icss.spring.service.impl.HelloServiceImpl"></bean> </beans>
写测试类测试一下我们写的代码吧
package com.icss.spring.test; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.ClassPathResource; import com.icss.spring.service.HelloService; public class Test { public static void main(String[] args) { //获取容器 ApplicationContext application=new ClassPathXmlApplicationContext("applicationContest.xml");//填入xml文件名,路径在src下 //BeanFactory application=new XmlBeanFactory(new ClassPathResource("applicationContest.xml"));//从bean工厂里面获取对象,与上面获取的区别为 上面的是直接初始化所有bean对象,在执行getBean()之前就开始了初始化工作,而这个是在得到对象时候才进行初始化操作 //获取业务对象 HelloService helloService=(HelloService) application.getBean("helloService");//获得bean对象 需要强转 不再需要去new对象啦
// 已经交给容器去实现了,这就是控制反转的实例 //调用对象的方法 helloService.sayHello(); } }
(这里编者自己认为是代码的一个更新过程,毕竟这是三种里面最简单的通过配置文件实例化对象的方法,其他两种都稍显复杂,如果不对请指出,积极学习改正。)
这个方法是通过配置文件导入bean,其实是上课有讲到三种方法的,后面两种分别需要用简单静态工厂与工厂方法来创建,只进行简单的说明不做举例。
1.使用类构造器实例化(默认无参数)
<bean id="bean1" class="com.chinasofti.spring.demo1.Bean1"></bean>
2.使用静态工厂方法实例化(简单工厂模式)
<bean id="bean2" class="com.chinasofti.spring.demo2.Bean2Factory" factory-method="getBean2"></bean>
public class Bean2Factory{
public static Bean2 getBean2(){
return new Bean2();
}
}
3.使用实例工厂方法实例化(工厂方法模式):
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
<bean id="bean3Factory" class="com.chinasofti.spring.demo2.Bean3Factory"/>
public class Bean3Factory{
public Bean3 getBean3(){
return new Bean3();
这里插入一张图 配置Eclipse中spring框架的xml的快捷提示 window-->xml catalog-->add-->spring-framework4.3.22.RELEASE\schema\beans\
这是我的第一篇博客,排版什么的都还不会,见证我的成长吧!!!