springMVC中controller层方法中使用private和public问题

本文探讨了在Spring AOP环境下,public与private方法在bean注入上的不同表现。作者通过解决一个实际项目中的bug,揭示了当使用private方法时,bean注入为何会失败的原因,以及如何避免这一问题。

楼主一直习惯使用public,偶尔手误也可能使用private,但是发觉也没啥区别,都能调用service层,注入bean。

      后来做一个新项目时,发觉自己以前的写的部分功能报错,当时有点懵逼,,找了半天都没发现哪里写错了,代码啥的都确定无错(这种时候最蛋疼,因为报错不太准确),以前写好的啥都没改,突然报错,经过蛋疼的排除,发现service层的注入都是null,但是还是一脸懵逼,我一直以为无区别,感觉自己的代码无错,经过长时间找寻(我感觉自己快要崩溃了),然后发现自己另一个类有相似的方法,就用的实体类不要样当然还有一个用public一个用private,经过测试才发现用public的方法,调用controller里面注入类才能注入。但是为什么会这样呢?为什么以前好好的,突然不可以了呢?

原因分析:

容器扫描bean生成代理类的时候,public和protected方法可以被正常代理,而private方法的不会被代理,属性的注入也是在代理类中完成,所以public/protected方法获取的注入属性是完成注入的属性,private方法获取的是未完成注入时的属性,所以是null。

原来是我们老大在项目加AOP,加了AOP以后会有影响,如果controller层方法需要调用注入的bean或者service层,那么只能使用public。

转载于:https://www.cnblogs.com/loong-hon/p/11308514.html

在 Spring MVC 框架中,Controller 并不直接调用 Mapper ,而是通过 Service 作为中间桥梁来完成对 Mapper 的调用。整个流程体现了典型的分架构设计思想,有助于提高代码的可维护性与可测试性。 ### 调用流程详解 1. **Controller 调用 Service ** Controller 负责接收客户端的请求,它通常会注入一个 Service 接口的实例,通过该实例调用 Service 方法来处理业务逻辑。例如: ```java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { return userService.getUserById(id); } } ``` 2. **Service 调用 Mapper ** Service 实现具体的业务逻辑,它通常会注入一个 Mapper 接口的实例,通过该实例执行数据库操作。例如: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public User getUserById(Long id) { return userMapper.selectById(id); // Mapper 方法 } } ``` 3. **Mapper 操作数据库** Mapper 由 MyBatis 管理,通常是一个接口,接口中的方法与数据库操作一一对应,MyBatis 会自动为其生成实现类。例如: ```java public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User selectById(Long id); } ``` 整个流程中,Controller 不直接与数据库交互,而是通过调用 Service 来完成业务逻辑处理,Service 再调用 Mapper 执行数据持久化操作,从而实现了清晰的职责划分与松耦合的设计。 这种结构也便于单元测试维护,因为每一都可以独立开发测试[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值