最近比较闲,把自己的笔记整理下,虽然都是些入门的东西,还是值得以后回味一下。先从spring开始,主要参考《spring in action(第二版)》和网络资料。
Spring是一个开源框架,为简化企业级应用开发应运而生的。
注:框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。框架的最大好处就是重用。
可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。
框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。构件通常是代码重用,而设计模式是设计重用,框架则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。可以说,框架是软件,而设计模式是软件的知识。
第一部分 spring的核心
Spring有很多功能,可以归纳为7个核心部件(后面会讲),spring的主要特性是依赖注入(DI, Dependency Injection)/控制反转(IoC, Inversion of Control)和面向切面编程(AOP, Aspect Oriented Programming)这两大特性(通常DI和IoC是指的同一个特性,但不完全相同)。
IoC: 所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系, 所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(一种松耦合的技术)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。
AOP: 面向方面(又称面向切面,总觉得都有点抽象)的编程,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。实现原理主要有两种,动态代理和cglib.
Spring 框架(参考http://www.ibm.com/developerworks/cn/java/wa-spring1/)
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如下图 1 所示。
图 1. Spring 框架的 7 个模块
组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
• 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开(注:松耦合)。
• Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。如果说BeanFactory使spring成为容器的话,那上下文模块(ApplicationContext)就是使spring成为框架的原因。
• Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
• Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。Spring提供了两种使用JDBC API的最佳实践,一种是以JdbcTemplate为核心的基于Template的JDBC的使用方式,另一种则是在JdbcTemplate基础之上的构建的基于操作对象的JDBC的使用方式。
• Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
• Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
• Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
• Spring还支持远程调用,允许将java对象的某些功能展现为远程调用,如果需要远程访问对象,远程调用模块会使编写远程对象很简单,就像是本地POJO(Plain Old Java Object)一样。有一些远程调用选项,包括RMI(Remote Method Invocation), Hessian,Burlap, JAX-RPC和Spring自己的HTTP Invoker.
• Java消息服务(JMS)远程调用的下面是取决于网络可靠性和通讯双方的可用性。基于消息的通讯是可靠的,并且即使在网络和端点不可用时,也可以保证消息的传递。
下面简要说明DI和AOP的概念。例子来自《spring in action(第二版)》,省略了例子描述,只留了代码示意。
DI
最常用的有两种注入方法(另外还有工厂方法注入,不常用):set注入和构造函数注入。
下面用xml配置简单说明这两种注入方式时spring做了什么操作。配置文件hello.xml。
在<bean>元素中,<property>元素表示在实例化此bean时通过set方法设置属性值(注意:这里只是描述spring做的事情,实际是用反射的写法实现的下面代码)。
上面主程序用到的BeanFactory就是spring容器,使用xml配置bean,所以使用的是XmlBeanFactory.
耦合是一个双头怪物,一方面,紧密耦合的代码难以测试,难以重用,难以理解;另一方面,完全没有耦合的代码什么也做不了,为了做一些有意义的工作,类必须以某种方式知道其它类的存在。
耦合是必须的,但要小心管理。
减少耦合的一个通常做法是将具体实现隐藏在接口下面,这样具体实现类的替换不会影响到引用类。
依赖注入的关键优点就是
松散耦合,这样可以尽可能使得应用对象之间保持疏远的关系。面向切面编程技术提供了另外一种解耦合的功能,它将应用功能(例如安全和事务)和对象分开。
反应的编程思想就是依赖接口而不是实现。
AOP
在spring中有多种方法可以用来实现切面,下面举个例子使用新的AOP命名空间(spring2.0引入),首先必须确保在上下文定义xml中申明命名空间:
上面只是给出一个aop的例子,现在不明白完全没关系,后面会单独讲解这个特性。
- 大小: 70.7 KB
- 大小: 70.1 KB
- 大小: 173.7 KB
- 大小: 68.7 KB
- 大小: 365.7 KB
分享到:
相关推荐
<artifactId>spring-boot-starter-velocity</artifactId> <version>1.3.6.RELEASE</version> </dependency> 2.导入本项目中的org.springframework目录下的velocity支持类,原样copy过去或自己打个jar 3.不想写...
spring-ai-core 0.8.1,解决大家使用2023.0.1.0 版本 Spring Cloud Alibaba 依赖,代码依赖下载报错问题,<dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> ...
Spring in Action CN.001<br>Spring in Action CN.002<br>Spring in Action CN.003<br>Spring in Action CN.004<br>Spring in Action CN.005<br>Spring in Action CN.006<br>Spring in Action CN.007<br>Spring in ...
<artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> ``` 继承 Starter 父 POM Spring Boot 提供了一个 Starter 父 POM,用于简化 Spring Boot 项目的构建过程。该 POM 包含了...
Spring in Action CN.001<br>Spring in Action CN.002<br>Spring in Action CN.003<br>Spring in Action CN.004<br>Spring in Action CN.005<br>Spring in Action CN.006<br>Spring in Action CN.007<br>Spring in ...
<br>结合 JSTL <br><spring:bind> 标签 <br>数据绑定的几个方法 <br><spring:message> 标签 <br><spring:transform> 标签 <br>其它 View 层 <br>除了 JSP View 层技术之外,您还可以使用其它的 View 层技术,或建立...
内容如下:<br>spring.rar [spring_aop1] [spring_aop2]<br>[spring_aop3] [spring_aop4] [spring_autowire_byName]<br>[spring_autowire_byType] [spring_beginning] [spring_hibernate_1]<br>[spring_hibernate_2] ...
中文版.part1.rar<br>Spring in Action. 中文版.part2.rar<br>Spring in Action. 中文版.part3.rar<br>Spring in Action. 中文版.part4.rar<br>Spring in Action. 中文版.part5.rar<br>Spring in Action. 中文版....
中文版.part1.rar<br>Spring in Action. 中文版.part2.rar<br>Spring in Action. 中文版.part3.rar<br>Spring in Action. 中文版.part4.rar<br>Spring in Action. 中文版.part5.rar<br>Spring in Action. 中文版....
中文版.part1.rar<br>Spring in Action. 中文版.part2.rar<br>Spring in Action. 中文版.part3.rar<br>Spring in Action. 中文版.part4.rar<br>Spring in Action. 中文版.part5.rar<br>Spring in Action. 中文版....
<groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.28.RELEASE</version> </dependency> ``` 接下来,我们需要配置Spring 4。Spring是一个全面的企业级应用开发框架...
2.7.6rc1.jar<br>asm.jar<br>asm-attrs.jar<br>cglib-2.1.3.jar<br>commons-collections-2.1.1.jar<br>commons-logging-1.0.4.jar<br>dom4j-1.6.1.jar<br>ehcache-1.1.jar<br>hibernate3.jar<br>jaas.jar<br>jaxen-...
Spring in Action CN.001<br>Spring in Action CN.002<br>Spring in Action CN.003<br>Spring in Action CN.004<br>Spring in Action CN.005<br>Spring in Action CN.006<br>Spring in Action CN.007<br>Spring in ...
Spring in Action CN.001<br>Spring in Action CN.002<br>Spring in Action CN.003<br>Spring in Action CN.004<br>Spring in Action CN.005<br>Spring in Action CN.006<br>Spring in Action CN.007<br>Spring in ...
Spring in Action CN.001<br>Spring in Action CN.002<br>Spring in Action CN.003<br>Spring in Action CN.004<br>Spring in Action CN.005<br>Spring in Action CN.006<br>Spring in Action CN.007<br>Spring in ...
Spring in Action CN.001<br>Spring in Action CN.002<br>Spring in Action CN.003<br>Spring in Action CN.004<br>Spring in Action CN.005<br>Spring in Action CN.006<br>Spring in Action CN.007<br>Spring in ...
Spring in Action CN.001<br>Spring in Action CN.002<br>Spring in Action CN.003<br>Spring in Action CN.004<br>Spring in Action CN.005<br>Spring in Action CN.006<br>Spring in Action CN.007<br>Spring in ...
<artifactId>spring-boot-starter-parent</artifactId> <version>2.x.x.RELEASE</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> ...
Spring in Action CN.001<br>Spring in Action CN.002<br>Spring in Action CN.003<br>Spring in Action CN.004<br>Spring in Action CN.005<br>Spring in Action CN.006<br>Spring in Action CN.007<br>Spring in ...