ssm学习笔记一 spring简介
1.1Spring简介
Spring采用了以下四中关键策略来简化java开发
基于简单老式java对象(PlainOld Java Object,简称POJO)的轻量级和最小侵入性编程
通过依赖注入(DependencyInjection,简称DI)和面向接口实现松耦合①
基于切面和惯例进行声明式编程
通过切面和模板减少样板式代码
1.1简化Java开发
1.1.1POJO
Spring的侵入式编程意味着这个类在Spring应用中和非Spring应用中都可以发挥同样的作用。Spring通过DI来装备POJO以实现保持应用对象之间保持松散耦合。
1.1.2DI
任何一个有意义的应用都由两个或者更多的类组成,这些类之间进行协作来完成特定的业务逻辑。传统上,每个对象负责管理与自己相互协作的对象(即所依赖的对象)的引用,这产生了高耦合和难以测试的代码。
1.1.3AOP
面向切面编程(aspect-orientedprogramming,简称AOP)允许吧遍布应用各处的功能分离出来形成可重用的组件。
面向切面编程往往被定义为促使软件系统实现关注点的分离一项技术。系统由许多不同的组件组成, 每一个组件各负责一块特定功能。除了实现自身核心的功能之外,这些组件还经常承担着额外的职责。诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点, 因为它们会跨越系统的多个组件。
AOP能够使这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。所造成的结果就是这些组件会具有更高的内聚性②并且会更加关注自身的业务,完全不需要了解涉及系统服务所带来复杂性。 总之,AOP能够确保POJO的简单性。
1.1.4使用模板消除样板代码
不要做重复工作,他会让你在职场失去竞争力,样板式的代码(boilerplatecode)就是一种重复工作。
Spring旨在通过模板封装来消除样板式代码。模板能够让你的代码关注于自身的职责。
1.2Bean
1.2.1Bean的声明周期
传统java中,bean的声明周期很简单,使用new进行bean实例化,然后就可以用了,如果不再使用,交由javaGC(JavaGarbage Collection ,java垃圾回收)机制进行自动垃圾回收。Spring中bean的声明周期就比较复杂了,如下图。
如你所见到的,bean的生命周期可以以下描述:
Spring对bean进行实例化;
Spring将值和bean的引用注入到bean对应的属性中;
如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBean-Name()方法;
如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;
如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessBeforeInitialization()方法;
如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似地, 如果bean使用initmethod声明了初始化方法,该方法也会被调用;
如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法;
此时, bean已经准备就绪,可以被应用程序使用了, 它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样, 如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
1.3Spring生态圈
1.3.1Spring模块
Spring模块依据其所属的功能一可分为6类,如图
-
Spring核心容器
容器是Spring框架最核心的部分,它管理着Spring应用中bean的创建、配置和管理。在该模块中,包括了Springbean工厂,它为Spring提供了DI的功能。基于bean工厂,我们还会发现有多种Spring应用上下文的实现,每一种都提供了配置Spring的不同方式。
除了bean工厂和应用上下文,该模块也提供了许多企业服务, 例如Email、JNDI访问、EJB集成和调度。所有的Spring模块都构建于核心容器之上。
Spring的AOP模块
这个模块是Spring应用系统中开发切面的基础。与DI一样,AOP可以帮助应用对象解耦。借助于AOP,可以将遍布系统的关注点( 例如事务和安全)从它们所应用的对象中解耦出来。
数据访问与集成
包括JDBC和DAO等模块,抽象了样板式代码使数据库代码变得简单明了。
Spring提供了ORM模块。Spring的ORM模块建立在对DAO的支持之上,并为多个ORM框架提供了一种构建DAO的简便方式。Spring没有尝试去创建自己的ORM解决方案,而是对许多流行的ORM框架进行了集成,包括Hibernate、JavaPersisternce API、JavaData Object和iBATISSQL Maps。Spring的事务管理支持所有的ORM框架以及JDBC。
Web与远程调用
MVC(Model-View-Controller)模式是一种普遍被接受的构建Web应用的方法,它可以帮助用户将界面逻辑与应用逻辑分离。它的Web和远程调用模块自带了一个强大的MVC框架,有助于在Web层提升应用的松耦合水平。
该模块还提供了多种构建与其他应用交互的远程调用方案。Spring远程调用功能集成了RMI(RemoteMethod Invocation)、 Hessian、Burlap、JAX-WS,同时Spring还自带了一个远程调用框架:HTTPinvoker。Spring还提供了暴露和使用RESTAPI的良好支持。
Instrumentation
Spring的Instrumentation模块提供了为JVM添加代理(agent)的功能。
测试
Spring为使用JNDI、Servlet和Portlet编写单元测试提供了一系列的mock对象实现。对于集成测试,该模块为加载Spring应用上下文中的bean集合以及与Spring上下文中的bean进行交互提供了支持。
注:①松耦合这里涉及到耦合性的概念,耦合性(英语:Coupling,dependency,或称耦合力或耦合度)是一种软件度量,是指一程序中,模块及模块之间信息或参数依赖的程度。通常来说,耦合性越强(耦合越紧),表明各模块间关系越密切,同事也就是说各模块不可分割使用,独立性差。
耦合具有两面性(two-headedbeast)紧密耦合的代码难以测试、难以复用、难以理解,并且呈现一种打地鼠式的bug特点,另一方面,一定程度的耦合性是必须的,完全没有耦合性的代码什么也做不了,因为模块间没有了联系。
耦合性百度百科https://baike.baidu.com/item/%E8%80%A6%E5%90%88%E6%80%A7/4297612?fr=aladdin
②内聚性内聚性(Cohesion)也称为内聚力,是一软件度量,是指机能相关的程序组合成一模块的程度,或是各机能凝聚的状态或程度。一般而言高内聚性代表低耦合性。
附:内聚性百度百科https://baike.baidu.com/item/%E5%86%85%E8%81%9A%E6%80%A7