问题:为什么 injection failed(注入失败)?
首先要确认:
- 是托管对象(有没有被扫描到?)
- 还是自己 new 的?(这个是无法注入!)
1、如果是应用属性相关的
要找一下,有没有相关的配置?
此例,当没有 xxx.yyy 配置时会出错:
import org.noear.solon.annotation.Inject;
@Inject("${xxx.yyy}")
String yyy;
2、如果是托管 Bean 相关的
正常的推理:
| 思考顺序 | 推理 | 处理建议 |
|---|---|---|
| 1 | 注入失败? | |
| 2 | 说明(容器)没有相关 Bean 注册 | |
| 3 | Bean 是通过配置的?还是扫描的? | |
| 4 | 如果是通过配置的? | 可能是缺少配置?或配置错了? |
| 5 | 如果没有扫描到?为什么会没扫到? | 检查下扫描范围 |
参考资料:《Bean 容器的扫描方式与范围》
示例1:会出错(bbb 包的 App 启动时,不会扫描 aaa 包下的类):
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Inject;
//---
package demo.aaa;
@Component
public class UserService {}
//---
package demo.bbb;
@Controller
public class UserController {
@Inject
UserService userService;
}
package demo.bbb;
public class App { //把 App 移到 demo 下,就不会出错(可同时扫描 aaa, bbb 等下级包)
public static void main(String[] args) {
Solon.start(App.class, args);
}
}
示例2:会出错(配置对应的表达式下没有需要的 Mapper)
solon.dataSources:
db1!:
class: "com.zaxxer.hikari.HikariDataSource"
jdbcUrl: jdbc:mysql://localhost:3306/rock?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true
driverClassName: com.mysql.cj.jdbc.Driver
username: root
password: 123456
mybatis.db1:
mappers:
- "demo.bbb.mapper.*"
package demo.aaa.mapper;
public class UserMapper {}
//---
package demo.bbb.mapper;
public class DemoMapper {}
//---
package demo.bbb.service;
@Component
public class UserService {
@Inject
UserMapper userMapper;
}