转载

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

【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:4.技术简介之Spring 欢迎阅读我的开源项目 《迷你微信》服务器 与 《迷你微信》客户端

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()了。

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

正文到此结束
Loading...