SpringBoot2.2.X版本懒加载的实现方法

10 篇文章 0 订阅
5 篇文章 0 订阅

项目依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

1. 全局配置

写法1

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    SpringApplication sa = new SpringApplication(Application.class);
    sa.setLazyInitialization(true);
    sa.run(args);
  }
}

写法2

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
	SpringApplicationBuilder sab = new SpringApplicationBuilder(Application.class);
	sab.lazyInitialization(true).run(args);
  }
}

写法3

直接在application.yml文件中

spring:
  main:
    lazy-initialization: true

展示效果

Controller层代码
package com.lx.controller;

import com.lx.service.IndexService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;


@Slf4j
@Lazy(false)
@RestController
public class IndexController {
  public IndexController() {
    log.info("[{}]开始初始化", IndexController.class);
  }

  @Autowired
  private IndexService indexService;

  @GetMapping("/")
  public String index() {
    indexService.index();
    return "success";
  }
}
Service层代码
package com.lx.service;

import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Lazy
@Service
public class IndexService {
  public IndexService() {
    log.info("[{}]开始初始化", IndexService.class);
  }

  public void index() {
    log.info("index method run");
  }
}
展示效果

启动项目后打印日志

访问localhost:8080后打印的日志

配置成功

2. 局部类/方法配置

想要实现局部类/方法的懒加载很简单,只需要在类/方法上添加@Lazy注解即可,默认值true开启懒加载,不开启可设置为false,例如:想要懒加载IndexController那么只需要在类上添加@Lazy注:我这里在展示局部实现效果时,项目中以去除全局懒加载的配置

package com.lx.controller;

import com.lx.service.IndexService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;

@Lazy
@Slf4j
@RestController
public class IndexController {
  public IndexController() {
    log.info("[{}]开始初始化", IndexController.class);
  }

  @Autowired
  private IndexService indexService;

  @GetMapping("/")
  public String index() {
    indexService.index();
    return "success";
  }
}

启动项目打印日志

GTbn4e.png

调用localhost:8080接口后打印的日志

**注:当设置懒加载的类/方法有被其他类初始化注入时,如果注入此类/方法的类没有设置懒加载的话,在启动时一样会被初始话。**例如:给IndexService添加@Lazy懒加载注解,然后去掉IndexController的懒加载注解后再启动项目查看日志

局部配置比全局配置优先级要高

  1. application.yml中设置开启全局懒加载配置

    spring:
      main:
        lazy-initialization: true
    
  2. IndexService通过@Lazy设置禁用懒加载

    package com.lx.service;
    
    import org.springframework.context.annotation.Lazy;
    import org.springframework.stereotype.Service;
    
    import lombok.extern.slf4j.Slf4j;
    
    @Lazy
    @Slf4j
    @Service
    public class IndexService {
      public IndexService() {
        log.info("[{}]开始初始化", IndexService.class);
      }
    
      public void index() {
        log.info("index method run");
      }
    }
    
    
  3. 启动项目查看日志打印,可以看到IndexService在项目启动时就进行了初始化,而IndexController在启动时并没有进行初始化

    GTOGHx.png

参考博客:https://juejin.im/post/5e83f795f265da47e449f4ea

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以给你一个简单的 MyWebSocketHandler 的示例,如下所示: ```java import com.alibaba.fastjson.JSON; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketMessage; import org.springframework.web.socket.WebSocketSession; @Component public class MyWebSocketHandler implements WebSocketHandler { private static final Logger logger = LoggerFactory.getLogger(MyWebSocketHandler.class); // 当 WebSocket 建立连接时调用 @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { logger.info("WebSocket opened"); session.sendMessage(new TextMessage("WebSocket connected")); } // 当收到 WebSocket 消息时调用 @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { logger.info("WebSocket received a message: {}", message.getPayload().toString()); // 解析收到的消息 try { MessageData data = JSON.parseObject(message.getPayload().toString(), MessageData.class); // 处理收到的消息 if ("ping".equals(data.getType())) { session.sendMessage(new TextMessage(JSON.toJSONString(new MessageData("pong")))); } else { session.sendMessage(new TextMessage(JSON.toJSONString(new MessageData("error", "Unknown message type")))); } } catch (Exception e) { logger.error("Error parsing or processing message: {}", e.getMessage()); } } // 当 WebSocket 关闭连接时调用 @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { logger.info("WebSocket closed"); } // 当发生错误时调用 @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { logger.error("WebSocket error: {}", exception.getMessage()); } // 是否支持部分消息 @Override public boolean supportsPartialMessages() { return false; } } ``` 这个简单的 MyWebSocketHandler 示例实现了 WebSocket 的基本功能,包括建立连接、接收消息、关闭连接等。在这个示例中,我们还演示了如何解析收到的 JSON 格式的消息,并根据消息类型做出不同的响应。这个示例可以作为你编写自己的 WebSocket 处理器的参考,实现更加复杂的功能。需要注意的是,在 SpringBoot 2.2.x 中,需要使用 `@Component` 注解将 WebSocket 处理器标记为 Spring 组件,以便自动扫描并注册到 Spring 容器中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值