Spring 框架 Spring框架 是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于J2EE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。–摘自百度 
Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说Spring是企业应用开发的“一站式”选择,并贯穿表现层、业务层及持久层。然而,Spring并不想取代那些已有的框架,而是与它们无缝地整合。
Spring 框架的核心特性是可以用于开发任何 Java 应用程序,但是在 Java EE 平台上构建 web 应用程序是需要扩展的。 Spring 框架的目标是使 J2EE 开发变得更容易使用,通过启用基于 POJO 编程模型来促进良好的编程实践。
Spring 两大核心技术 控制反转(IoC:Inversion of Control ) /依赖注入(DI:Dependency Injection ) 
Spring 最认同的技术是控制反转的依赖注入(DI)模式。控制反转(IoC)是一个通用的概念,它可以用许多不同的方式去表达,依赖注入仅仅是控制反转的一个具体的例子。
当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能的独立于其他的 Java 类来增加这些类可重用可能性,当进行单元测试时,可以使它们独立于其他类进行测试。依赖注入(或者有时被称为配线)有助于将这些类粘合在一起,并且在同一时间让它们保持独立。
到底什么是依赖注入?让我们将这两个词分开来看一看。这里将依赖关系部分转化为两个类之间的关联。例如,类 A 依赖于类 B。现在,让我们看一看第二部分,注入。所有这一切都意味着类 B 将通过 IoC 被注入到类 A 中。
依赖注入可以以向构造函数传递参数的方式发生,或者通过使用 setter 方法 post-construction。由于依赖注入是 Spring 框架的核心部分,具体的细节请参考spring技术手册。
面向切面的程序设计(AOP-Aspect Oriented Programming): 
Spring 框架的一个关键组件是面向切面的程序设计(AOP)框架。一个程序中跨越多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。有各种各样常见的很好的关于方面的例子,比如日志记录、声明性事务、安全性,和缓存等等。
在 OOP 中模块化的关键单元是类,而在 AOP 中模块化的关键单元是方面。AOP 帮助你将横切关注点从它们所影响的对象中分离出来,然而依赖注入帮助你将你的应用程序对象从彼此中分离出来。
Spring 框架的 AOP 模块提供了面向方面的程序设计实现,可以定义诸如方法拦截器和切入点等,从而使实现功能的代码彻底的解耦出来。
开发环境搭建 
软件 
版本 
 
 
HGDB 
安全版V4、企业版v5及以上版本 
 
JDK 
1.6、1.7、1.8 
 
Java IDE 
Eclipse、IntelliJ IDEA 
 
Spring 
5.2.3 
 
MyBatis 
3.3 
 
示例项目 结构图如下:
主要文件介绍 :
mybatis-configuration.xml:MyBatis全局配置文件,开启二级缓存,以及别名定义
<settings>    <!-- 打开延迟加载的开关 -->    <setting name="lazyLoadingEnabled" value="true" />    <!-- 将积极加载修改为消极加载,即延迟加载 -->    <setting name="aggressiveLazyLoading" value="false" />    <!--开启二级缓存 -->    <setting name="cacheEnabled" value="true" /> </settings> <!-- 包的别名定义 --> <typeAliases>    <package name="com.highgo.pojo" /> </typeAliases> 
 
applicattionContext.xml:spring 全局配置文件
<!-- 加载classpath下的db.properties文件,里面配了数据库连接的一些信息 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">     <property name="driverClassName" value="${jdbc.driver}" />     <property name="url" value="${jdbc.url}" />     <property name="username" value="${jdbc.username}" />     <property name="password" value="${jdbc.password}" />     <property name="maxActive" value="10" />     <property name="maxIdle" value="5" /> </bean> <!-- 配置sqlSessionFactory,SqlSessionFactoryBean是用来产生sqlSessionFactory的 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">     <!-- 加载mybatis的全局配置文件,放在classpath下的mybatis文件夹中 -->     <property name="configLocation" value="mybatis/mybatis-configuration.xml" />     <!-- 加载数据源,使用上面配置好的数据源 -->     <property name="dataSource" ref="dataSource" /> </bean> <!-- MapperFactoryBean:根据mapper接口生成的代理对象 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 		<!-- 指定扫描的包名 如果扫描多个包,那么每个包中间使用半角逗号分隔 --> 	    <property name="basePackage" value="com.highgo.mapper"></property> 	    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean>  
 
db.properties: 数据库配置信息
#db.properties #dataSource=org.apache.commons.dbcp.BasicDataSource jdbc.driver=com.highgo.jdbc.Driver jdbc.url=jdbc:highgo://192.168.2.5:5866/test jdbc.username=test jdbc.password=test 
 
User.java:创建 pojo 类
public class User {    private int id;    private String name;    private Date birthday;    public int getId() {       return id;    }    public void setId(int id) {       this.id = id;    }    public String getName() {       return name;    }    public void setName(String name) {       this.name = name;    }    public Date getBirthday() {       return birthday;    }    public void setBirthday(Date birthday) {       this.birthday = birthday;    }    @Override    public String toString() {       return "User{" +             "id=" + id +             ", name='" + name + '\'' +             ", birthday=" + birthday +             '}';    } } 
 
UserMapper.java:创建接口 
package com.highgo.mapper; import com.highgo.pojo.User; public interface UserMapper { 	public User selectUserById(int id) throws Exception; } 
 
UserMapper.xml:创建xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"   "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.highgo.mapper.UserMapper"> 	  	<!-- 根据 id 查询 user 表中的数据   	   id:唯一标识符,此文件中的id值不能重复   	   resultType:返回值类型,一条数据库记录也就对应实体类的一个对象   	   parameterType:参数类型,也就是查询条件的类型 	--> 	<select id="selectUserById" resultType="com.highgo.pojo.User" parameterType="int">     	select * from test_user where id = #{id} 	</select> 	 </mapper> 
 
UserMapperTest.java:测试代码
public class UserMapperTest {        private ApplicationContext applicationContext;     @Before     public void setUp() throws Exception {         applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");     }     @Test     public void testSelectUserById() throws Exception {        UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper");        User user = userMapper.selectUserById(1);        System.out.println(user);          } } 
 
执行结果: