此处以xml配置和注解两种方式为大家介绍smart-socket于spring的集成方案,前期需要做的准备工作就是先搭建一个spring工程,并引入smart-socket依赖,pom.xml配置如下图。

    • 定义协议类
    • 定义处理器
    1. @Override
    2. public void process(AioSession<String> session, String msg) {
    3. WriteBuffer writeBuffer = session.writeBuffer();
    4. byte[] bytes = msg.getBytes();
    5. try {
    6. writeBuffer.writeInt(bytes.length);
    7. writeBuffer.write(bytes);
    8. } catch (IOException e) {
    9. e.printStackTrace();
    10. }
    11. }
    12. @Override
    13. public void stateEvent(AioSession<String> session, StateMachineEnum stateMachineEnum, Throwable throwable) {
    14. }
    15. }

    准备工作就绪后,我们需要在application.xml配置它们的实例bean,并将其引用至AioQuickServer的bean配置。因为AioQuickServer的构造方法都是带参数的,所以配置bean的时候需要用到标签constructor-arg

    当启动spring容器时,我们的通信服务便开始运行。接下来我们来验证一下集成后的效果,如果将其配置到真正的web服务中演示过程稍显琐碎,故我们直接通过main函数来调用。

    1. public class SpringDemo {
    2. public static void main(String[] args) {
    3. ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
    4. AioQuickServer aioQuickServer = context.getBean("aioQuickServer", AioQuickServer.class);
    5. System.out.println("服务启动成功:" + aioQuickServer);
    6. ((ClassPathXmlApplicationContext) context).close();
    7. }

    2. 注解方式启动服务

    如果读者习惯用注解的方式使用Spring,那我们需要对原有的代码稍加改动。Protocol和MessageProcessor实现类需要加上注解@Component

    • 定义协议类
    • 定义处理器
    1. @Component("messageProcessor")
    2. public class ServerProcessor implements MessageProcessor<String> {
    3. @Override
    4. public void process(AioSession<String> session, String msg) {
    5. WriteBuffer writeBuffer = session.writeBuffer();
    6. byte[] bytes = msg.getBytes();
    7. try {
    8. writeBuffer.writeInt(bytes.length);
    9. writeBuffer.write(bytes);
    10. } catch (IOException e) {
    11. e.printStackTrace();
    12. }
    13. }
    14. @Override
    15. public void stateEvent(AioSession<String> session, StateMachineEnum stateMachineEnum, Throwable throwable) {
    16. }
    17. }

    接下来我们修改application.xml配置,default-autowire="byName"表示优先按bean名称注入,而注解的扫描扫描包路径为org.smartboot.example.spring

    1. @Component
    2. public class SpringDemo {
    3. @Autowired
    4. private MessageProcessor messageProcessor;
    5. @Autowired
    6. private Protocol protocol;
    7. private AioQuickServer aioQuickServer;
    8. public static void main(String[] args) {
    9. ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
    10. SpringDemo demo = context.getBean("springDemo", SpringDemo.class);
    11. System.out.println("服务启动成功:" + demo.aioQuickServer);
    12. ((ClassPathXmlApplicationContext) context).close();
    13. System.out.println("服务关闭");
    14. }
    15. @PostConstruct
    16. public void init() {
    17. aioQuickServer = new AioQuickServer(8080, protocol, messageProcessor);
    18. try {
    19. aioQuickServer.start();
    20. } catch (IOException e) {
    21. e.printStackTrace();
    22. }
    23. }
    24. @PreDestroy
    25. public void destroy() {
    26. aioQuickServer.shutdown();
    27. }