java游戏服务器开发之整合spring

netty和spring的结合
上篇将netty大致部署好了,但是里面的配置我们都是写在代码里面,其实这样是不太好的,毕竟你改个参数就要打包一下。
所以打算写在配置文件中,顺便把spring也集成进来


第一步,在pom文件中加入spring的包,

  <spring.version>4.2.4.RELEASE</spring.version>这个写在properties标签里面,
其他写在dependencys标签里面
 
 

    <spring.version>4.2.4.RELEASE</spring.version>

<!-- spring框架包 -->

   <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.6.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-commons</artifactId> <version>1.11.2.RELEASE</version> </dependency>第二步,添加配置文件server-config-dev.properties,用这种写法就可以了
#
code.debug=true
port=8088
channelType=NIO
protocolType=TCP
第三步,添加spring的配置文件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:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
						http://www.springframework.org/schema/context
						http://www.springframework.org/schema/context/spring-context-4.2.xsd
						http://www.springframework.org/schema/tx 
						http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
						http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd">

  <!-- 启用注解 -->
  <context:annotation-config/>

  <!-- 启动组件扫描,排除@Controller组件,该组件由SpringMVC配置文件扫描 -->
  <context:component-scan base-package="com.lizhaoblog">
  </context:component-scan>

  <!--<!–事务–>-->
  <!--<tx:annotation-driven/>-->
  <!--<!–定时任务–>-->
  <!--<task:annotation-driven/>-->

  <!--指向的配置文件-->
  <bean id="cfgProps" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="locations">
      <list>
        <value>classpath:properties/server-config-dev.properties</value>
      </list>
    </property>
  </bean>
  <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="properties" ref="cfgProps">
    </property>
  </bean>


  <bean id="log4jInitializer" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass"
              value="org.springframework.util.Log4jConfigurer"/>
    <property name="targetMethod" value="initLogging"/>
    <property name="arguments">
      <list>
        <value>classpath:log4j-dev.xml</value>
      </list>
    </property>
  </bean>
</beans>

第四步,修改ServerConfig类中的代码,里面的变量可以直接指向cfgProps中设置的值,如  

@Value("#{cfgProps['port']}")

  private Integer port;

设置初始化方法init,通过PostConstruct注解,初始化之后执行。

/**
 * Copyright (C), 2015-2018
 * FileName: ServerConfig
 * Author:   zhao
 * Date:     2018/6/12 11:16
 * Description: 服务的配置内容
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.lizhaoblog.server.pojo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * 〈一句话功能简述〉<br>
 * 〈服务的配置内容〉
 *
 * @author zhao
 * @date 2018/6/12 11:16
 * @since 1.0.0
 */
@Component
@Scope("singleton")
public class ServerConfig {
  private static final Logger logger = LoggerFactory.getLogger(ServerConfig.class);

  @Value("#{cfgProps['port']}")
  private Integer port;
  @Value("#{cfgProps['channelType']}")
  private String channelType;
  @Value("#{cfgProps['protocolType']}")
  private String protocolType;

  private ApplicationContext applicationContext;

  private static ServerConfig instance = null;

  private ServerConfig() {
  }

  public static ServerConfig getInstance() {
    if (instance == null) {
      instance = new ServerConfig();
      logger.debug("ServerConfig is not init by spring");
    }
    return instance;
  }

  @PostConstruct
  public void init() {
    instance = this;
    printServerInfo();
  }

  public void printServerInfo() {
    logger.info("**************Server INFO******************");
    logger.info("protocolType  : " + protocolType);
    logger.info("port          : " + port);
    logger.info("channelType   : " + channelType);
    logger.info("**************Server INFO******************");
  }

  public Integer getPort() {
    return port;
  }

  public void setPort(Integer port) {
    this.port = port;
  }

  public String getChannelType() {
    return channelType;
  }

  public void setChannelType(String channelType) {
    this.channelType = channelType;
  }

  public String getProtocolType() {
    return protocolType;
  }

  public void setProtocolType(String protocolType) {
    this.protocolType = protocolType;
  }

  public ApplicationContext getApplicationContext() {
    return applicationContext;
  }

  public void setApplicationContext(ApplicationContext applicationContext) {
    this.applicationContext = applicationContext;
  }
}

这样spring就整合完成了,可以在各个地方使用 applicationContext.getBean("xxx")获取某些类了
而applicationContext对象我在ServerConfig之中保存了,需要
ServerConfig.getInstance().getApplicationContext().getBean("xxx");





上面的代码在码云上 https://gitee.com/lizhaoandroid/JgServer
后续代码添加,不好阅读的话,可以查看分支netty-factory
可以加qq群一起探讨Java游戏服务器开发的相关知识 676231524


猜你喜欢

转载自blog.csdn.net/cmqwan/article/details/80726720