搭建SSM框架之Spring
作为一枚大四准备毕业的学生,最重要的事便是毕业设计,前些日子刚刚拿到毕设题目:“3D网络图:面向网络结构数据的可视化软件设计”,(⊙o⊙)…,怎么说哪,看到题目就是一头雾水(前几届不都是学生选课系统,学生教务管理系统吗-_-||,说好的套路那),望着题目,看看在公司里要学的PeopleSoft,我去,毫无关系好吗。在学校学了两年JAVA,校外实习交了一万多学习了JavaEE,找个工作去干了PeopleSoft-_-||,毕设又是可视化设计,唉,真是世事多变,人生无常啊。
好了,吐槽归吐槽,为了吃饭,为了毕业什么都得慢慢来。仔细了解了一下题目:“本题目要求学生使用webGL技术开发一个用于数据可视化呈现的web应用软件。网络结构数据的可视化表现方式一直是数据可视化领域研究的重点。采用webGL技术,可以使用现代浏览器直接在网页上呈现3D效果,为网络结构数据可视化和交互设计提供了新的可能。”突然想起在学校的日子里对那些网页上呈现3D效果代码的着迷(也就在那时学了JS,甚至决定了以后校外实习的选择),回想起那时的时光,看看现在做的PeopleSoft,理想和现实的差距还真是大o(╥﹏╥)o,大概熟悉了一下题目后和老师聊了聊,原来这次毕设和我的理想是那么的接近,那就开始做,而且要好好做,人不止是为了现实而活着,至少要向自己的理想迈出几步。
首先老师让先搭起一套框架,说实话不管是实习还是在大学,框架都没有深入理解过(实习时刚学到JS,就找到工作,也没想到会做PeopleSoft),那就从头开始,慢慢来吧!
翻开好久不动的JAVA资料,打开好久没看的JAVA视频,学着学着突然有种想哭的冲动(不要问我为什么,就是很难过),以下便是我学习Spring的过程,以后会一直更新,直到把毕设做完。
首先我了解到Spring是一个社区,也是一个很大的项目,其中包含了很多子项目,我主要用到的是其中的核心项目Spring Framework。
Spring-framework 框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块。这些模块分为Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和测试部分,其中我主要去学习的是Core Container和AOP。
一、 其中Spring中有两个重要的概念:
IOC:Inversion of Control 控制反转
spring核心容器也可以称为IOC容器,该容器主要负责管理各种对象的声明周期(对象的创建、初始化、销毁等)
IOC容器并没有实现更多的功能,但它的存在使我们不需要很多代码、不需要考虑对象间复杂的耦合关系就能从IOC容器中获取合适的对象,而且提供了各种对象的可靠的管理,极大地降低了开发的复杂性。
总结:
1.IOC意味着将你设计好的类交给了spring容器去控制,而不是在类的内部自己进行控制。
2.有IOC容器之后,剩下的工作只是在IOC容器中堆积木
3.之前项目中对象和对象之间的关系是直接写死在代码中的,而使用了IOC容器后则是在代码中并没有写对象和对象是什么关系,而是把这种关系的建立交给了IOC容器去做,并且是在代码运行的时候动态建立起来(我们可以通过配置文件进行任意改变)
4.IOC其实就是一种将调用者与被调用者分离的思想。
DI:Dependency Injection 依赖注入
DI的概念的提出是用来代替IOC的,表示让调用类对某一接口实现类的依赖关系由容器注入,以移除调用类对某一接口实现类的依赖。(思考servlet和service层接口以及service层接口实现类这三者的关系)
依赖注入 这个名词显然比 控制反转 更直接明了,并且易于理解。
二、对此有了了解后,下载Spring:
http://repo.springsource.org/libs-release-local/org/springframework/spring/3.2.4.RELEASE/spring-framework-3.2.4.RELEASE-dist.zip
直接粘到地址栏或者下载工具里,每次有更新只要改版本号就可以。
三、然后就是Spring的配置流程及需要理解的内容:
Spring IOC容器核心api(容器将来会是一个对象)
BeanFactory接口
BeanFactory是Spring中IOC容器的核心接口,主要用于处理Bean的初始化和配置,建立对象间的依赖关系
接口中主要方法如下:
//根据指定名称返回一个Bean实例
Object getBean(String name)
//判断名称为name的Bean是否是原型,即是否总是返回一个新实例(非单例)
boolean isPrototype(String name)
//判断名称为name的Bean是否是单例
boolean isSingleton(String name)
//判断容器中是否包含给定名称的Bean实例
boolean containsBean(String name)
//如果名称为name的Bean有别名则返回所以别名
String[] getAliases(String name)
ApplicationContext接口
该接口继承于BeanFactory,增强了BeanFactory,增加了事务处理AOP,国际化,事件传递等功能
所以在代码中我们一般会使用ApplicationContext接口,以及这个接口相应的实现类来创建spring的容器对象
例如:
String path = "com/briup/ioc/set/set.xml";
ApplicationContext container =
new ClassPathXmlApplicationContext(path);
Student s = (Student)container.getBean("student");
四、配置文件
Spring通过读取配置文件中的数据来对项目各个对象进行实例化,配置以及组装,通常使用XML文件来作为配置文件
XML基本结构如下:
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
</beans>
注意事项:
1.这个文件的头部声明可以在下载的spring文档中的示例找到
2.这里面用到了俩个schema文件(.xsd文件),分别是spring-beans-3.2.xsd和spring-context-3.2.xsd,它们也可以在下载的spring文档中找到
3.在Eclipse中把xml文件和schema文件关联后,xml中就可以有标签代码的提示了(注意关联时别配置错了)
4.spring框架是模块化的,之后使用其他模块的时候,还可以在该xml的根元素中继续引用其他模块中相应的schema文件,然后就可以使用引入新模块中的标签代码了
测试例子:
set方式注入(必须依靠set方法):
导入jar包:
创建两个测试类,例如Student和Teacher,其中Teacher类中包含Student。
编写XML文件:
<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <bean name="stu" class="com.briup.bean.Student"> <property name="id" value="1"></property> <property name="name" value="tom"></property> <property name="age" value="20"></property> </bean> <bean name="teacher" class="com.briup.bean.Teacher"> <property name="id" value="1"></property> <property name="name" value="zhangsan"></property> <property name="student" ref="stu"></property> </bean>
写测试方法:
public void ioc_set() { try { String[] path = {"com/briup/ioc/set/set.xml"}; ApplicationContext container = new ClassPathXmlApplicationContext(path); Teacher t = (Teacher)container.getBean("teacher"); System.out.println(t); System.out.println(t.getId()); System.out.println(t.getName()); System.out.println(t.getStudent()); System.out.println("-------------"); System.out.println(t.getStudent().getId()); System.out.println(t.getStudent().getName()); System.out.println(t.getStudent().getAge()); } catch (Exception e) { e.printStackTrace(); } }
这就是一个Spring实现控制反转,依赖注入的例子。
总结(Spring):
1.降低耦合性(在一个类中运行时引入其他类,而不是直接new对象)
2.去除一些方法中重复代码(例如日志文件,权限控制,事务处理(开事务,提交事务,异常事务处理) //需要这个代码,但这个代码又不能直接写到这里)
spring可以在运行期间把代码进行动态结合
3.管理对象的生命周期
4.spring核心容器中放入对象,这些对象被称为bean(可重复使用的组件)
5.IOC:反转,主动变被动
DI:依赖(依赖的解释:例如web层依赖service层,service层依赖dao层)注入,DI的概念的提出是用来代替IOC的