欢迎阅读我的开源项目《迷你微信》服务器《迷你微信》客户端

Spring是一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。——百度百科

序言

博主在《迷你微信》服务器项目上对Spring的使用主要在于依赖注入,也是Spring的核心功能,通过依赖注入的方法,我们就可以大量的减少动态创建和单例的使用,由Spring进行创建初始化和注入。

配置与使用

关于Spring的环境配置就不在这里详细说明了,只要在项目中导入Spring的jar包和添加applicationContext.xml文件就好了,在这里咱们主要讲讲applicationContext.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!--上面的不用细看,都是配置必须的东西,主要是下面的东西 -->
<!-- Log模块 -->
<bean id="MyLogger" class="server.MyLogger">
</bean> <!-- 网络模块 -->
<bean id="ServerNetwork" class="server.ServerNetwork">
<property name="myLogger">
<ref bean="MyLogger" />
</property>
</bean>

在这里,博主删减了大量代码,只为了简要的介绍Spring的简单使用,详细代码请参考开源项目《迷你微信》服务器。首先,创建了一个叫MyLogger的Bean,这个名字是你自己起的,后面的class参数是你这个类所在的项目位置;接着,是ServerNetwork,这个类具体是干啥的这里就不介绍了,与讨论的东西无关。可以看到,ServerNetwork中有一个参数myLogger,而这个myLogger又有一个指向MyLogger的引用,代表的意义是,在Java的类ServerNetwork中,有一个叫myLogger的参数,这个参数所要设置的值为之前创建的一个叫做MyLogger的东东

这里,博主要向大家强调Spring的几个特点:

  • Spring的依赖注入是先创建好所有的bean之后,才进行参数的注入,所以不用担心bean前后顺序导致的注入null问题
  • 在要被注入的类中必须要有Set方法,比如本示例中,在ServerNetwork类中,必须有setMyLogger方法。
  • 由于注入阶段是在创建完所有bean对象后才开始的,所以不要在要创建的对象的构造方法中使用要注入的对象。

与Mina的联合使用

在使用Mina框架时,Spring是可以跟Mina紧密结合的,让Spring来创建Mina的整个连接过程是配置式编程的一种典型的做法,详细可以参考官网介绍,博主表示官网说的太简略,所以自己也只配出了一半左右。

初始化问题

由于上面所述的“由于注入阶段是在创建完所有bean对象后才开始的,所以不要在要创建的对象的构造方法中使用要注入的对象”问题,会导致很多类的初始化出现问题,因为若是将初始化方法写在构造方法中,调用到未注入的参数,就会出现NullPointer的异常,这种问题如何解决呢?博主发现了一个办法:

首先,在每个需要初始化的类中添加init()方法来进行初始化:

public class A{
public A(){
}
public void init(){
// 初始化
}
}

这样,就将初始化过程和构造方法分离开来了。然而,初始化方法何时调用呢?请接着看(代码来自开源项目《迷你微信》服务器)

public class Server {
public static void main(String[] args) throws IOException {
// 开启Spring,进行依赖注入
ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");
// 调用A的初始化方法
((A) ctx.getBean("A")).init();
}
}

我们可以看到,首先,我们在最开始的Main方法内运行了applicationContext.xml文件,他是Spring的配置文件,可以开始Spring的依赖注入,然后我们从这里面,拿出已经被Spring实例化的A对象,这时,所有配置的对象都已经实例化和参数注入好了,就可以调用其中的初始化方法init()了。

欢迎阅读我的开源项目《迷你微信》服务器《迷你微信》客户端

【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:4.技术简介之Spring的更多相关文章

  1. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:0.概述

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 序言 帖主和队友仿制了一个简单版的微信,其中,队友是用Unity3D做前段,帖主用Java的Mina.Hiberna ...

  2. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:7.项目介绍之架构(1)

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 <迷你微信>服务器端是使用Java语言,Mina框架编写的,一个良好的架构关系到后期迭代的方便程度 ...

  3. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:9.观察者模式

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在一个程序的迭代过程中,复杂度渐渐上升,可能会出现一些跨模块的调用的需求,若是直接得到引用来进行使用,会导致模 ...

  4. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:8.自定义传输协议

    欢迎阅读我的开源项目<迷你微信>服务器)与<迷你微信>客户端 前言 在上一篇中,我们讲到了<迷你微信>服务器)的主体架构,还讲到了如何在现有功能上进行拓展,但是拓展 ...

  5. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:6.技术简介之Protobuf

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 protocolbuffer(以下简称Protobuf)是google 的一种数据交换的格式,它独立于语言,独立于平 ...

  6. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:5.技术简介之Hibernate

    目录 序言 配置 hibernate.cfg.xml配置文件 加载hibernate.cfg.html配置文件并获取Session 对象的注解配置 增删改查 具体的增删改查代码 数据库操作的封装 连接 ...

  7. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统 :1.技术简介之Mina连接

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Apache MINA(Multipurpose Infrastructure for Network Applic ...

  8. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:3.技术简介之MinaFilter——LoggingFilter (转)

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 LoggingFilter 接下来,使我们对Filter介绍的最后一个——LoggingFilter. 与Proto ...

  9. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:10.项目介绍之架构(2)

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 前面我们讲到<迷你微信>服务器端的主架构,现在我们来描述一下它的模块详细信息. 网络模块 从上图我 ...

随机推荐

  1. PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯

    转自:http://blog.csdn.net/vbvcde/article/details/7660497 我们提供 PPI协议的官方文档,协议更新时间为2005年,下面是我们根据文档解析的PPI读 ...

  2. C# FileStream Write追加写入文本

    该例子为追加 C盘中的 file1.txt 的文本内容 完整代码如下: 引入命名空间: [csharp] view plain copy print? using System.IO; 完整代码: [ ...

  3. Polygon

    用当前的笔绘制一个由两个或多个点(顶点)连接的多边形. BOOL Polygon( LPPOINT lpPoints, int nCount ); lpPoints 指向一个指定多边形顶点的点.数组中 ...

  4. 【244】◀▶IEW-Unit09

    Unit 9 Food 1)Model1题目及范文讲解 In the world today, there is a problem with food production. As a result ...

  5. day1 java基础回顾-内省

    为什么要学内省? 开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性. 内省是用于操作j ...

  6. prototype for '类名::函数名'does not match any in class'类名'

    函数声明和定义参数类型必须相同. 前置声明一定要放到名称空间内,代表该名称空间内的类.

  7. NativeScript官方书籍:NativeScript in Action-用你现有技术构建移动应用程序

    大家好,我用nativescript做企业级移动应用开发一年多了.从最初只能看nativescript英文文档,到现在看到官方发布正式的书籍,感觉nativescript变得越来越好. 当然,在这个过 ...

  8. 道阻且长 莫失本心(我的OI之旅

    道阻且长 莫失本心      今天午睡醒来,发现自己发烧了.尽管穿的很厚,尽管今天的阳光如此明媚.身体还是由内而外地散发着冷意. 期末考已经结束了,接下来又是艰难而难忘的奥赛训练.(要到春节才能放假了 ...

  9. 怎么解决java.lang.NoClassDefFoundError错误

    http://blog.csdn.net/jamesjxin/article/details/46606307

  10. React中的代码分割

    代码分割想要解决的问题是:经打包工具