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); } }
执行结果: