一、项目分层

1. 三层架构
  在 JavaEE 开发中,几乎全都是基于 B/S 架构(浏览器/服务器)开发。系统标准的三层架构包括:表现层、业务层、持久层,三层架构在实际开发中使用的非常多,下面介绍三层具体是什么。

三层架构

2. 表现层
  表现层也称为web层,它负责接收客户端请求,向客户端响应结果。通常客户端使用 http协议请求web 层, web层需要接收HTTP请求,完成HTTP响应。表现层常用框架都是对servlet的封装,如SpringMVC。
  表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。表现层的设计一般都使用 MVC 模型( MVC 是表现层的设计模型,和其他层没有关系):

  • 1.获取请求数据
  • 2.调用service
  • 3.根据servic返回结果,响应返回数据

3. 业务层
  业务层也称为service 层,它负责业务逻辑处理,和项目开发的需求息息相关。事务一般在service层(业务逻辑层) 处理,所以可以用Spring框架的声明式事务。web层依赖业务层,但是业务层不依赖web层。
  业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。(也就是我们说的事务应该放到业务层来控制)

4. 持久层
  持久层也称为dao 层,负责数据持久化,包括数据层即数据库和数据访问层。数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中。通俗的讲,持久层就是和数据库交互,对数据库表进行曾删改查的。常用的持久层的解决方案(框架),都是对JDBC技术的封装,如Mybatis。

5. 三层架构常用技术
项目分层

二、Spring框架简介

1. 定义
  Spring是一个开源框架,是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用各种组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发,从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。

2. 优势

  • 方便解耦,简化开发:Spring可以管理所有对象的创建和依赖关系的维护;

  • AOP编程的支持:Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能;

  • 声明式事务的支持 :只需要通过配置就可以完成对事务的管理,而无须手动编程;

  • 方便程序的测试:Spring对Junit4支持,可以通过注解方便的测试Spring程序;

-方便集成各种优秀的框架:Spring内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis等)的直接支持;

  • 降低JavaEE API的使用难度:Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等)都提供了封装,使这些API应用难度大大降低。

Spring官方文档翻译(1~6章)

三、Spring框架体系结构

Spring框架架构

Spring框架由7个定义良好的模块(组件)组成,各个模块可以独立存在,也可以联合使用

1. Spring Core
  核心容器提供了Spring的基本功能。核心容器的核心功能是用Ioc容器来管理类的依赖关系,Spring采用的模式是调用者不理会被调用者的实例的创建,由Spring容器负责被调用者实例的创建和维护,需要时注入给调用者,这是目前最优秀的解耦模式。

2. Spring AOP
  Spring的AOP模块提供了面向切面编程的支持。SpringAOP采用的是纯Java实现,Spring AOP采用基于代理的AOP实现方案,AOP代理由Ioc容器负责生成、管理,依赖关系也一并由Ioc容器管理,尽管如此,Spring Ioc容器并不依赖于AOP,这样我们可以自由选择是否使用AOP。

3. Spring ORM
  提供了与多个第三方持久层框架的良好整合。

4. Spring DAO
  Spring进一步简化DAO开发步骤,能以一致的方式使用数据库访问技术,用统一的方式调用事务管理,避免具体的实现侵入业务逻辑层的代码中。

5. Spring Context
  它是一个配置文件,为Spring提供上下文信息,提供了框架式的对象访问方法。Context为Spring提供了一些服务支持,如对国际化(i18n)、电子邮件、校验和调度功能。

6. Spring Web
  提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servlet listeners进行IoC容器初始化和针对Web的applicationContext。

7. Spring MVC
  提供了Web应用的MVC实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型,在领域模型代码和web form之间,并且还可以借助Spring框架的其他特性。

四、Spring IOC 和 AOP

1. 程序中耦合概念
  在软件工程中, 耦合指的就是就是对象之间的关联性。对象之间的耦合越高,维护成本越高,因此对象的设计应使类和构件之间的耦合最小。 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准,划分模块的一个准则就是高内聚低耦合。高内聚,低耦合:简单来说,就是类内部的关系越紧密越好,类与类之间的关系越少越好。

2. 三层架构解耦

Spring的核心是控制反转(IOC)面向切面编程(AOP)

在三层架构(dao层、service层、controller层)中如何降低这三层的耦合度?当dao接口的实现出现修改,比如更换了数据库,如何实现不修改service层实现代码?

解决方法:利用控制反转(Inversion Of Control),做到 控制反转就实现了解耦。传统方式:在获取对象时,都是采用new一个对象的方式,是主动的;采用控制反转:在获取对象时跟工厂要,有工厂为我们查找或者创建对象,是被动的,这种被动接受的方式获取对象的思想就是控制反转。

3. Spring IOC && AOP

五、ApplicationContext.xml配置

1. 所需要引入的命名空间

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" 
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans  
                           http://www.springframework.org/schema/beans/spring-beans.xsd 
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context.xsd 
                           http://www.springframework.org/schema/tx 
                           http://www.springframework.org/schema/tx/spring-tx.xsd">

2. 扫描包下面所有的service层

<!--1. 扫描service包-->
<context:component-scan base-package="com.zz.service" />

3. 加载JDBC配置文件

<!--加载jdbc.properties配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>

4. 创建数据库连接池

配置类用阿里巴巴的配置核心类 DruidDataSource

<!--2. 创建连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${jdbc.driver}"></property>
    <property name="url" value="${jdbc.url}"></property>
    <property name="username" value="${jdbc.username}"></property>
    <property name="password" value="${jdbc.password}"></property>
    <property name="initialSize" value="${jdbc.initialSize}"></property>
    <property name="maxActive" value="${jdbc.maxActive}"></property>
</bean>

5. 创建SqlSessionFactoryBean

使用MyBatis:

<!--3. 创建SqlSessionFactoryBean,注入连接池-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
</bean>

使用Hibernate:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <!-- 与dataSource -->
    <property name="dataSource" ref="dataSource"/></property>
</bean>

6. 创建包扫描器

<!--4. 创建包扫描器,指定扫描的dao接口所在包-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.zz.dao"></property>
</bean>

7. 创建事务管理器

<!--5. Spring提供的事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

8. 开启事务注解支持

<!--6. 开启声明式事务注解支持-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>


星河滚烫,你是人间理想