此处以xml配置和注解两种方式为大家介绍smart-socket于spring的集成方案,前期需要做的准备工作就是先搭建一个spring工程,并引入smart-socket依赖,pom.xml配置如下图。
- 定义协议类
- 定义处理器
@Override
public void process(AioSession<String> session, String msg) {
WriteBuffer writeBuffer = session.writeBuffer();
byte[] bytes = msg.getBytes();
try {
writeBuffer.writeInt(bytes.length);
writeBuffer.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void stateEvent(AioSession<String> session, StateMachineEnum stateMachineEnum, Throwable throwable) {
}
}
准备工作就绪后,我们需要在application.xml配置它们的实例bean,并将其引用至AioQuickServer的bean配置。因为AioQuickServer
的构造方法都是带参数的,所以配置bean的时候需要用到标签constructor-arg
。
当启动spring容器时,我们的通信服务便开始运行。接下来我们来验证一下集成后的效果,如果将其配置到真正的web服务中演示过程稍显琐碎,故我们直接通过main函数来调用。
public class SpringDemo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
AioQuickServer aioQuickServer = context.getBean("aioQuickServer", AioQuickServer.class);
System.out.println("服务启动成功:" + aioQuickServer);
((ClassPathXmlApplicationContext) context).close();
}
2. 注解方式启动服务
如果读者习惯用注解的方式使用Spring,那我们需要对原有的代码稍加改动。Protocol和MessageProcessor实现类需要加上注解@Component
。
- 定义协议类
- 定义处理器
@Component("messageProcessor")
public class ServerProcessor implements MessageProcessor<String> {
@Override
public void process(AioSession<String> session, String msg) {
WriteBuffer writeBuffer = session.writeBuffer();
byte[] bytes = msg.getBytes();
try {
writeBuffer.writeInt(bytes.length);
writeBuffer.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void stateEvent(AioSession<String> session, StateMachineEnum stateMachineEnum, Throwable throwable) {
}
}
接下来我们修改application.xml配置,default-autowire="byName"
表示优先按bean名称注入,而注解的扫描扫描包路径为org.smartboot.example.spring
。
@Component
public class SpringDemo {
@Autowired
private MessageProcessor messageProcessor;
@Autowired
private Protocol protocol;
private AioQuickServer aioQuickServer;
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
SpringDemo demo = context.getBean("springDemo", SpringDemo.class);
System.out.println("服务启动成功:" + demo.aioQuickServer);
((ClassPathXmlApplicationContext) context).close();
System.out.println("服务关闭");
}
@PostConstruct
public void init() {
aioQuickServer = new AioQuickServer(8080, protocol, messageProcessor);
try {
aioQuickServer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
@PreDestroy
public void destroy() {
aioQuickServer.shutdown();
}