在Spring MVC中使用工具类调用Service层时,Service类为null如何解决

因为平时在调用service层时都是在controller中,有配置扫描注入,spring会根据配置自动注入所依赖的服务层。

但因我们写的工具类不属于controller层,所以当所写接口需要调用服务层是,常常会为NULL。

下面就分享一个实践后可行的办法,如下图所示:
第一种:
@Component //申明为spring组件
public class TestUtils {
@Autowired
private TestService testService; //添加所需service的私有成员
private static TestUtils testUtils ; // 关键点1 静态初使化 一个工具类 这样是为了在spring初使化之前

public void setTestService(TestService  testService) {  
    this.testService = testService;  
}  

@PostConstruct     //关键二   通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
public void init() {  
    testUtils = this;  
    testUtils.testService = this.testService;   // 初使化时将已静态化的testService实例化
}  

}

这样下面的代码中就可以通过 testUtils.testService 来调用service处理
第二种:
这里写图片描述
主要是:1.将此工具类加上@Component注解

2.将所需调用的服务类设置成静态属性,并通过方法直接将服务层设置成工具类自己的属性即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个简单的图书管理系统的登录和注册的实现: 1. 创建数据库表 创建一个名为 `user` 的表,包含以下字段: ``` id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, password VARCHAR(50) NOT NULL ``` 2. 配置数据源 在 `application.properties` 文件配置数据库连接信息: ``` spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=123456 ``` 3. 添加依赖 在 `pom.xml` 文件添加以下依赖: ```xml <dependencies> <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> </dependencies> ``` 4. 创建实体类和 Mapper 创建 `User` 实体类和 `UserMapper` 接口,用于操作数据库的 `user` 表。 `User.java`: ```java public class User { private int id; private String username; private String password; // getter and setter methods } ``` `UserMapper.java`: ```java @Mapper public interface UserMapper { @Insert("INSERT INTO user(username, password) VALUES(#{username}, #{password})") void insert(User user); @Select("SELECT * FROM user WHERE username=#{username} AND password=#{password}") User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password); } ``` 5. 配置 MyBatis 在 `application.properties` 文件配置 MyBatis: ``` # MyBatis mybatis.mapper-locations=classpath:mapper/*.xml ``` 6. 创建 Mapper XML 文件 在 `src/main/resources/mapper` 目录下创建 `UserMapper.xml` 文件,并添加以下内容: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.mapper.UserMapper"> <!-- empty --> </mapper> ``` 7. 创建 Service 类 创建 `UserService` 类,用于处理登录和注册的逻辑。 `UserService.java`: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public void register(User user) { userMapper.insert(user); } public User login(String username, String password) { return userMapper.findByUsernameAndPassword(username, password); } } ``` 8. 创建 Controller 类 创建 `UserController` 类,用于接收 HTTP 请求,调用 `UserService` 处理业务逻辑,并返回响应结果。 `UserController.java`: ```java @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @PostMapping("/register") public void register(@RequestBody User user) { userService.register(user); } @PostMapping("/login") public User login(@RequestParam String username, @RequestParam String password) { return userService.login(username, password); } } ``` 9. 测试 启动应用,使用 Postman 或其他 HTTP 请求工具,向以下 URL 发送请求进行测试: - 注册:POST http://localhost:8080/user/register - 登录:POST http://localhost:8080/user/login 以上就是一个简单的图书管理系统的登录和注册的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值