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

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

序言

博主在《迷你微信》服务器项目上对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()了。

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

05-11 01:29