netty和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