Spring七大模块的简单讲解

Spring的理解及其特性

Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用

框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件同时为 J2EE应用程序开发提供集成的框架。

我对于一个java项目的拆分有三部分,第一JAVA代码,第二配置文件,第三,所需要的各种jar包,其中起到粘合和统筹的是配置文件,一般的作用是框架的搭建和资源的加载,所以学习Spring,我们先看看配置文件

Spring框架的七大模块

组成 Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现

 

  • Spring Core

Core封装包是框架的最基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。

通俗来说,Spring是以bean的方式管理和组织java中的各个模块,而以factory模式来产生和管理bean,而factory是以IOC的模式将配置和实际的应用程序分开,当然除了配置文件,一般也会用注解的方式将bean依赖注入到Spring的容器中。

对于IOC我的理解就是,平常我们需要一个对象直接new一个,而IOC,我们就像调用一个类的一个方法,他自己给我们抛出它的一个对象,而有了Spring的core Containter ,这些对象都由这个容器通过工厂模式进行产生和管理,我们需要什么样的对象,就直接从这个容器里面去取

 

例如:

[xml]
<bean id="car" name="#car1" class="com.baobaotao.simple.Car"></bean>
[/xml]

一般情况下,Spring IOC容器中的一个Bean即对应配置文件中的一个<bean>,这种镜像对应关系应该容易理

解。其中id为这个Bean的名称,通过容器的getBean(“car”)即可获取对应的Bean,在容器中起到定位查找

的作用,是外部程序和Spring IOC容器进行交互的桥梁。class属性指定了Bean对应的实现类。

[java]

public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
//调用容器准备刷新的方法,获取容器的当时时间,同时给容器设置同步标识

prepareRefresh();
//告诉子类启动refreshBeanFactory()方法,Bean定义资源文件的载入从
//子类的refreshBeanFactory()方法启动

ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

//为BeanFactory配置容器特性,例如类加载器、事件处理器等

prepareBeanFactory(beanFactory);
try {
//为容器的某些子类指定特殊的BeanPost事件处理器
postProcessBeanFactory(beanFactory);

//调用所有注册的BeanFactoryPostProcessor的Bean
invokeBeanFactoryPostProcessors(beanFactory);

//为BeanFactory注册BeanPost事件处理器.
//BeanPostProcessor是Bean后置处理器,用于监听容器触发的事件

registerBeanPostProcessors(beanFactory);
//初始化信息源,和国际化相关.
initMessageSource();
//初始化容器事件传播器.
initApplicationEventMulticaster();
//调用子类的某些特殊Bean初始化方法
onRefresh();
//为事件传播器注册事件监听器.
registerListeners();
//初始化所有剩余的单态Bean.
finishBeanFactoryInitialization(beanFactory);
//初始化容器的生命周期事件处理器,并发布容器的生命周期事件
finishRefresh();
}
catch (BeansException ex) {
//销毁以创建的单态Bean
destroyBeans();
//取消refresh操作,重置容器的同步标识.
cancelRefresh(ex);
throw ex;
}
}
}
[/java]

  • Spring Context

Spring 上下文是一个配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。一般是在提供一些上下文信息,我的理解就是spring需要运行前的一个简单的准备工作:项目中的配置在Spring-web.xml里面

[xml]<context:component-scan base-package="com.sprucetec.pms">[/xml]

表示启动spring的组件扫描功能(从spring2.5版本开始)。即扫描base-package包或者子包下面的Java文件,如果扫描到有@controller、@Service、@Repository、@Component等注解的java类,就会将这些bean注册到工厂中。还可以使用分号来分隔多个扫描包。

[xml]<mvc:annotation-driven />[/xml]

<mvc:annotation-driven />是告知Spring,我们启用注解驱动。然后Spring会自动为我们注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter等几个Bean到工厂中,此时我们可以使用@RequestMapping、@Valid注解来处理请求,也可以使用@ResponseBody来处理返回结果。

[xml]<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
[/xml]

PropertyPlaceholderConfigurer可以将上下文(配置文件)中的属性值放在另一个单独的标准java Properties文件中去。在XML文件中用${key}替换指定的properties文件中的值。这样的话,只需要对properties文件进 行修改,而不用对xml配置文件进行修改。

 

常用的注解:

<context:component-scan/> 扫描指定的包中的类上的注解,常用的注解有:

@Controller 声明Action组件
@Service    声明Service组件    @Service(“myMovieLister”)
@Repository 声明Dao组件
@Component   泛指组件, 当不好归类时.
@RequestMapping(“/menu”)  请求映射
@Resource  用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name=”beanName”)
@Autowired 用于注入,(srping提供的) 默认按类型装配
@Transactional( rollbackFor={Exception.class}) 事务管理
@ResponseBody
@Scope(“prototype”)   设定bean的作用域

 

  • SpringDAO

   定义:全称是(Data Access Object)数据访问对象,它属于O/R Mapping技术的一种。在O/R Mapping技术发布之前,开发者 需要直接借助于JDBC和SQL来完成与数据库的相互通信,在O/R Mapping技术出现之后,开发者能够使用DAO或其他不同的DAO框架来实现与 RDBMS(关系数据库管理系统)的交互。借助于O/R Mapping技术,开发者能够将对象属性映射到数据表的字段、将对象映射到RDBMS中、这 些Mapping技术能够为应用自动创建高效的SQL语句等,除此之外,O/R Mapping技术还提供了延迟加载、缓存等高级特征,而DAO是 O/R Mapping技术的一种实现,因此,使用DAO能够大量节省程序开发时间,减少代码量和开发的成本。

1、DAO 代表数据访问对象(Data Access Object),它描述了一个应用中DAO的角色,DAO的存在提供了读写数据库中数据的一种方法,把这个功能通过接口提供对外服务,程序的其他模块通过这些接口来访问数据库,这样会有很多好处,首先,由于服务对象不再和特定的接口实现绑定在一起,使得它们易于测试,因为它提供的是一种服务,在不需要连接数据库的条件下就可以进行单元测试,极大地提高了开发效率。其次,通过使用与持久化技术无关的方法访问数据库,在应用程序的设计和使用上都有很大的灵活性,对于整个系统无论是在性能上还是应用上也是一个巨大的飞跃。

2、DAO的主要目的就是将持久性相关的问题与一般的业务规则和工作流隔离开来,它为定义业务层可以访问的持久性操作引入了一个接口并且隐藏了实现的具体细节,该接口的功能将依赖于采用的持久性技术而改变,但是DAO接口可以基本上保持不变。

3、Spring 提供了一套抽象的DAO类,供开发者扩展,这有利于以统一的方式操作各种DAO技术,例如JDO、JDBC等,这些抽象DAO类提供了设置数据源及相关辅助信息的方法,而其中的一些方法同具体DAO技术相关。目前,Spring DAO抽象提供了以下几种类:

4、JdbcDaoSupport:JDBC DAO抽象类,开发者需要为它设置数据源(DataSource),通过子类,开发者能够获得JdbcTemplate来访问数据库。

5、HibernateDaoSupport:Hibernate DAO抽象类。开发者需要为它配置Hibernate SessionFactory。通过其子类,开发者能够获得Hibernate实现。

6、JdoDaoSupport:Spring为JDO提供的DAO抽象类,开发者需要为它配置PersistenceManagerFactory,通过其子类开发者能够获得JdoTemplate。

7、在使用Spring的DAO框架进行数据库存取时,无须接触使用特定的数据库技术,通过一个数据存取接口来操作即可。

 

  • Spring ORM

ORM全称对象关系映射(Object/Relation Mapping),指将Java对象状态自动映射到关系数据库中的数据上,从而提供透明化的持久化支持,即把一种形式转化为另一种形式。

Spring对ORM的支持主要表现在以下方面:

  • 一致的异常体系结构,对第三方ORM框架抛出的专有异常进行包装,从而在使我们在Spring中只看到DataAccessException异常体系;
  • 一致的DAO抽象支持:提供类似与JdbcSupport的DAO支持类HibernateDaoSupport,使用HibernateTemplate模板类来简化常用操作,HibernateTemplate提供回调接口来支持复杂操作;
  • Spring事务管理:Spring对所有数据访问提供一致的事务管理,通过配置方式,简化事务管理。Spring还在测试、数据源管理方面提供支持,从而允许方便测试,简化数据源使用

 

对象与关系数据库之间是不匹配,我们把这种不匹配称为阻抗失配,主要表现在:

关系数据库首先不支持面向对象技术如继承、多态,如何使关系数据库支持它们;

关系数据库是由表来存放数据,而面向对象使用对象来存放状态;其中表的列称为属性,而对象的属性就是属性,因此需要通过解决这种不匹配;

如何将对象透明的持久化到关系数据库表中;

如果一个对象存在横跨多个表的数据,应该如何为对象建模和映射。

其中这些阻抗失配只是其中的一小部分,比如还有如何将SQL集合函数结果集映射到对象,如何在对象中处理主键等。

ORM框架就是用来解决这种阻抗失配,提供关系数据库的对象化支持。

ORM框架不是万能的,同样符合80/20法则,应解决的最核心问题是如何在关系数据库表中的行和对象进行映射,并自动持久化对象到关系数据库。

ORM解决方案适用于解决透明持久化、小结果集查询等;对于复杂查询,大结果集数据处理还是没有任何帮助的。

目前已经有许多ORM框架产生,如Hibernate、JDO、JPA、iBATIS等等,这些ORM框架各有特色,Spring对这些ORM框架提供了很好的支持,接下来首先让我们看一下Spring如何支持这些ORM框架。

 

  • Spring AOP

[java]
@Aspect
@Component
public class BizExceptionInterceptor {
Logger logger = LoggerFactory.<i>getLogger</i>(BizExceptionInterceptor.class);
@Pointcut("execution(* com.sprucetec.pms.srm.api.SupplierRelativeApi.*(..)) || execution(* com.sprucetec.pms.srm.api.SupplierContentPriceApi.*(..)) || execution(* com.sprucetec.pms.srm.service.sapp..*.*(..))")
public void scPriceMethod() {
}

@Around(value = "scPriceMethod()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

}
[/java]

所谓AOP代理,就是AOP框架动态创建的对象,这个对象通常可以作为目标对象的替代品,而AOP代理提供比目标对象更加强大的功能。真实的情形是,当应用调用AOP代理的方法时,AOP代理会在自己的方法中回调目标对象的方法,从而完成应用的调用。

关于AOP代理的典型例子就是Spring中的事务代理Bean。通常,目标Bean的方法不是事务性的,而AOP代理包含目标Bean的全部方法,而且这些方法经过加强变成了事务性方法。简单地说,目标对象是蓝本,AOP代理是目标对象的加强,在目标对象的基础上,增加属性和方法,提供更强大的功能。

对象与关系数据库之间是不匹配,我们把这种不匹配称为阻抗失配,主要表现在:

关系数据库首先不支持面向对象技术如继承、多态,如何使关系数据库支持它们;

关系数据库是由表来存放数据,而面向对象使用对象来存放状态;其中表的列称为属性,而对象的属性就是属性,因此需要通过解决这种不匹配;

如何将对象透明的持久化到关系数据库表中;

如果一个对象存在横跨多个表的数据,应该如何为对象建模和映射。

其中这些阻抗失配只是其中的一小部分,比如还有如何将SQL集合函数结果集映射到对象,如何在对象中处理主键等。

ORM框架就是用来解决这种阻抗失配,提供关系数据库的对象化支持。

ORM框架不是万能的,同样符合80/20法则,应解决的最核心问题是如何在关系数据库表中的行和对象进行映射,并自动持久化对象到关系数据库。

ORM解决方案适用于解决透明持久化、小结果集查询等;对于复杂查询,大结果集数据处理还是没有任何帮助的。

目前已经有许多ORM框架产生,如Hibernate、JDO、JPA、iBATIS等等,这些ORM框架各有特色,Spring对这些ORM框架提供了很好的支持,接下来首先让我们看一下Spring如何支持这些ORM框架。

 

《通知》

前置通知(Before Advice):在切入点选择的连接点处的方法之前执行的通知,该通知不影响正常程序执行流程(除非该通知抛出异常,该异常将中断当前方法链的执行而返回)

后置通知(After Advice):在切入点选择的连接点处的方法之后执行的通知,包括如下类型的后置通知:

后置返回通知(After returning Advice):在切入点选择的连接点处的方法正常执行完毕时执行的通知,必须是连接点处的方法没抛出任何异常正常返回时才调用后置通知。

后置异常通知(After throwing Advice): 在切入点选择的连接点处的方法抛出异常返回时执行的通知,必须是连接点处的方法抛出任何异常返回时才调用异常通知。

后置最终通知(After finally Advice): 在切入点选择的连接点处的方法返回时执行的通知,不管抛没抛出异常都执行,类似于Java中的finally块。

环绕通知(Around Advices):环绕着在切入点选择的连接点处的方法所执行的通知,环绕通知可以在方法调用之前和之后自定义任何行为,并且可以决定是否执行连接点处的方法、替换返回值、抛出异常等等。

《切入点指示符》

execution用于匹配方法执行的连接点;

         within用于匹配指定类型内的方法执行;

         this用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配;

         target用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;

         args用于匹配当前执行的方法传入的参数为指定类型的执行方法;

         @within用于匹配所以持有指定注解类型内的方法;

         @target用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;

         @args用于匹配当前执行的方法传入的参数持有指定注解的执行;

         @annotation用于匹配当前执行方法持有指定注解的方法;

         beanSpring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法;

         reference pointcut表示引用其他命名切入点,只有@ApectJ风格支持,Schema风格不支持。

AspectJ切入点支持的切入点指示符还有: call、get、set、preinitialization、staticinitialization、initialization、handler、adviceexecution、withincode、cflow、cflowbelow、if、@this、@withincode;但Spring AOP目前不支持这些指示符,使用这些指示符将抛出IllegalArgumentException异常。这些指示符Spring AOP可能会在以后进行扩展。

 

  • Spring Web

我的理解就是,用来接洽其它框架,用来将Spring和其它web框架相兼容,

用于整合Web框架,例如Struts1、Struts2、JSF等

例如: Spring框架提供了ActionSupport类支持Struts 1的Action。继承了ActionSupport后就能获取Spring的BeanFactory,从而获得各种Spring容器内的各种资源

public class CatAction extends ActionSupport{ }

Spring整合Struts2

A

 

 

 

 

B Spring根据配置文件创建WebApplicationContext对象,并将其保存在Web应用的ServletContext中。

如果要获取应用中的ApplicationContext实例

 

注意:其中Struts2只是一个伪控制器,这个伪控制器的功能实际由Spring容器中的控制器来完成,这就实现了让核心控制器调用Spring容器中的action来处理用户请求。在这种策略下,处理用户请求的Action由Spring插件负责创建,但Spring插件创建Action实例时。并不是利用配置Action时指定的class属性来创建该action实例,而是从Spring容器中取出对应的Bean实例完成创建

 

  • Spring MVC

    MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的。Spring框架的功能可以用在任何J2EE服务器当中,大多数功能也适用于不受管理的环境。

Spring的核心要点就是支持不绑定到特定J2EE服务的可重用业务和数据的访问的对象,毫无疑问这样的对象可以在不同的J2EE环境,独立应用程序和测试环境之间重用。

DispatcherServlet   — 前置控制器

HandlerMapping接口 — 处理请求的映射

HandlerMapping接口的实现类:

SimpleUrlHandlerMapping  通过配置文件,把一个URL映射到Controller

DefaultAnnotationHandlerMapping  通过注解,把一个URL映射到Controller类上

执行流程:

1、客户端发送HTTP请求到服务器

2、SpringMVC的核心DispatcherServlet将请求交给HandlerMapping处

理,DispatcherServlet是前置控制器,配置在web.xml文件中的。

3、HandlerMapping通过查询机制找到处理当前请求的Handler

4、DispatcherServlet将请求交给这个Handler处理

5、Handler处理完成后返回一个ModleAndView对象,这个对象包含

视图逻辑名和数据对象

6、返回的视图逻辑名会通过视图解析器解析成真正的视图,并交给

DispatcherServlet处理

7、DispatcherServlet将请求分派给真正的视图对象,并反映到客户端

SpringMVC详细解释

 

SpringMVC必须知道的接口和类:

HandlerAdapter接口 — 处理请求的映射

AnnotationMethodHandlerAdapter类,通过注解,把一个URL映射到Controller类的方法上

Controller接口 — 控制器

我们使用了@Controller注解,添加了@Controller注解注解的类就可以担任控制器(Action)的职责

HandlerInterceptor 接口–拦截器

无图,我们自己实现这个接口,来完成拦截的器的工作。

ViewResolver接口的实现类

UrlBasedViewResolver类 通过配置文件,把一个视图名交给到一个View来处理

InternalResourceViewResolver类,比上面的类,加入了JSTL的支持

HandlerInterceptor 接口–拦截器

无图,我们自己实现这个接口,来完成拦截的器的工作。

ViewResolver接口的实现类

UrlBasedViewResolver类 通过配置文件,把一个视图名交给到一个View来处理

HandlerExceptionResolver接口 –异常处理

You may also like...