1. 前言
- 最近报名了一个软件工程的课程, 课程中需要小组组队, 开发一个项目, 我们小组呢打算做一个数字化课堂的项目, 但是需要用到Java的一些框架, 基本设想是使用 SpringMVC + Spring + MyBatis + MySQL 的架构处理。
- 不过很讨厌的是, 本人只学过C/C++. 对 Java 也不太了解, 更不用说这些框架了, 于是下面记录下学习的过程
- 我个人选用的教程是 极客学院的视频教程 http://www.jikexueyuan.com/path/javaweb/
2. 基本知识
2.1 Spring
- 核心: Spring IOC 和 AOP
Spring 是一个轻量级反转 IOC 和 面向切片 AOP 的容器框架, 主要是为了解决企业应用开发的复杂性而诞生的 (分层, 一站式)
- 目的: 解决企业应用开发的复杂性
- 功能: 使用基本的 javaBean 代替 EJB
- 范围: 任何 JAVA 应用
优点:
i. 方便解耦, 简化开发
ii. AOP 编程支持
iii. 声明式事物支持
iv. 方便程序测试
v. 方便集成各种优秀框架
vi. 降低了JAVAEE API 的使用难度
vii. Spring 源码是经典的学习范例- 核心模块
2.2 Spring IOC (核心解耦)
- IOC (Inversion of Control, 控制反转) 是spring 的核心, 贯穿始终。 所谓 IOC, 对于spring 框架来说, 就是由 spring 来负责控制对象的生命周期和对象之间的关系。
- 传统开发模式: 对象之间相互依赖
- IOC 开发模式: IOC 容器安排对象之间的依赖 (减少 对象之间的耦合关系)
- IOC 的另外的名字叫做依赖注入(Dependency Injection), 所谓的依赖注入, 就是由IOC 容器在运行期间, 动态的将某种依赖关系注入到对象中。 所以, 依赖注入 DI 和 控制反转 IOC 是从不同角度的描述的同一件事情, 就是指通过引入 IOC 容器, 利用依赖关系注入的方式, 实现对象之间的解耦
- 主机 读取 Upan 或者 移动硬盘 (IOC :人, 根据需求 挂接 不同的 usb 设备)
- IOC 好处
- 可重用性, 可扩展性
- 降低组件之间的耦合度, 方便单元测试
- 提高开发效率和产品质量, 不需关心其他组件的状态
- 统一标准, 提高模块的复用性
- 模块有热插拔特性(配置文件中定义)
- 可重用性, 可扩展性
- 通俗理解:
- IOC 控制反转: 创建对象的实例的控制权从代码控制剥离到 IOC 容器控制, 实际就是在 xml 文件中控制, 侧重于原理
- DI 依赖注入: 创建对象实例时候, 为这个对象注入属性值或其他对象实例, 侧重实现
2.3 Spring AOP
- 面向切面编程
- AOP 是对 OOP 的延续
- OOP 是静态角度考虑问题
- AOP 是动态角度考虑问题, 面对运行中的某个过程
- 主要功能: 日志, 异常, 事物 etc
- 主要意图:
- 将常用服务分离开来, 作为独立的服务组件
AOP 专门用于处理系统中分布于各个模块中的交叉关注点的问题, 在 Java EE 应用中, 常常通过 AOP 来处理一些具有横切性质的系统及服务, 如事物管理, 安全检查, 缓存, 对象池管理等, AOP 已经成为一种非常常用的解决方案:
存在价值: (传统处理方法)
降低后期维护的复杂度AOP 方法
- AOP 代理其实是由 AOP 框架动态生成的一个对象, 该对象可以作为目标对象使用, AOP 代理所包含的方法与目标对象的方法如下关系:
- 代理对象的方法 = 增强处理 + 被代理对象的方法
- AOP 代理其实是由 AOP 框架动态生成的一个对象, 该对象可以作为目标对象使用, AOP 代理所包含的方法与目标对象的方法如下关系:
- AOP 的通俗理解:
将 组件 A 和 B 分离开来, 解耦和, 让他们各自关心自己的业务逻辑。
ps: 怎么感觉 AOP 和 IOC 差不多啊, 都是实现解耦用的。。。。
3. Spring 开发环境搭建
3.1 下载相应组件
- 包括 jdk, jre, eclipse, spring framework
- 由于我们的电脑之前配置过android 的开发环境, 就只需要下载一个 spring framework 的开发包就可以了
3.2 遇到的一些问题
这些问题, 主要是由于我们本机上安装的jre 与 eclipse 不匹配所造成的
参考解决方案: http://bbs.csdn.net/topics/390837714
不过, 我们这里是直接采用 android 的eclipse 作为我们的 java web 开发的环境了
4. 构建一个简单实例
4.1 实例 UML
这个有点像 简单工厂模式, 只不过他的对应部分通过java 的反射机制在 xml 中完成了
4.2 遇到的一些问题
- NoClassDefFoundError: logging LogFactory
解决方案: http://jingyan.baidu.com/article/8cdccae99cb845315413cdc4.html
下载一个 commons.loggin.jar 即可
相应的下载地址: http://download.csdn.net/download/badlucktang/1594563
4.3 运行结果
4.4 相关代码
需要注意的是 HelloChina, HelloWorld, Person 之间相互独立, 通过 xml 配置文件联系起来
IHelloMessage.java
package com.jike.spring.chap01; public interface IHelloMessage { public String sayHello(); }
HelloChina.java
package com.jike.spring.chap01; public class HelloChina implements IHelloMessage { @Override public String sayHello() { // TODO Auto-generated method stub return "你好"; } }
HelloWorld.java
package com.jike.spring.chap01; public class HelloWorld implements IHelloMessage { @Override public String sayHello() { // TODO Auto-generated method stub return "Hello World"; } }
Person.java
package com.jike.spring.chap01; public class Person { private IHelloMessage helloMessage; public IHelloMessage getHelloMessage() { return helloMessage; } public void setHelloMessage(IHelloMessage helloMessage) { this.helloMessage = helloMessage; } public String sayHello(){ return this.helloMessage.sayHello(); //return this.sayHello(); } }
Main.java
package com.jike.spring.chap01; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub // 这个函数有点简单工厂的味道, 不过他借助了java 的反射机制 Resource r = new FileSystemResource("helloMessage.xml"); BeanFactory f = new XmlBeanFactory(r); Person person = (Person)f.getBean("person"); String s = person.sayHello(); System.out.print("The person is currently saying" + s); } }
helloMessage.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPERING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id = "helloWorld" class="com.jike.spring.chap01.HelloWorld"></bean> <bean id = "helloChina" class="com.jike.spring.chap01.HelloChina"></bean> <bean id = "person" class="com.jike.spring.chap01.Person"> <property name="helloMessage" ref="helloChina"/> </bean> </beans>