IoC 与配置注入
本页只保留与当前仓库 AI 开发最相关的 IoC 规则。
默认结论
- 字段注入可以使用
@Inject,但字段不能是private。 - 配置注入使用
@InjectValue。 - 常见配置文件是
bootstrap.yaml、application.yaml、application-{profile}.yaml。 - 通过
nop.profile激活 profile。 - 需要明确依赖时,也可以使用 setter 注入。
- 不要把 Spring 专有注解和 Spring AOP 用法当作当前仓库默认模式。
推荐写法
public class MyComponent {
@Inject
protected MyDependency dependency;
@InjectValue("@cfg:app.config-value|default-value")
protected String configValue;
@InjectValue("@cfg:app.timeout|30")
protected int timeout;
}
配置文件与 profile
| 文件 | 作用 |
|---|---|
bootstrap.yaml |
启动期基础配置,优先进入配置系统 |
application.yaml |
应用主配置 |
application-{profile}.yaml |
按 nop.profile 激活的环境覆盖配置 |
对当前仓库里的 AI 开发,记住这几个结论就够了:
- 基础层里,环境变量和系统属性优先级高于
bootstrap.yaml。 - 之后还可能叠加配置中心、key file、props file、JDBC、扩展配置和应用配置。
bootstrap.yaml会先于应用配置参与加载。application-{profile}.yaml会覆盖application.yaml。
激活 profile
最常见的是:
nop:
profile: dev
也可以通过启动参数设置 -Dnop.profile=dev。
为什么 private 不行
当前仓库源码中,ClassModelBuilder 在发现字段时会跳过 private 字段,因此 @Inject private Foo foo; 不会成为可靠写法。
配置相关的默认判断
| 场景 | 默认做法 |
|---|---|
| 注入 bean | @Inject |
| 注入配置值 | `@InjectValue("@cfg:key |
| 需要动态测试配置 | @NopTestConfig(testConfigFile = ...) |
模块与 bean 发现规则
- Nop 应用侧 bean 发现默认是基于文件,不是基于 Java classpath scanning。
- 启用模块通过
/<moduleId>/_module被发现。 - app 容器自动加载的通常是
/<moduleId>/beans/app.beans.xml和app-*.beans.xml。 /nop/autoconfig/*.beans和nop.ioc.app-beans.files也可以补充 bean 文件。_service.beans.xml这类生成文件通常是被app-service.beans.xml导入,而不是自己被自动发现。- 所有以
_开头的文件都是 codegen 管线自动生成的,不允许手动修改。包括但不限于_service.beans.xml、_dao.beans.xml、_app.orm.xml、_gen/*.java等。如需定制 IoC 注册,修改对应的非下划线文件(如app-service.beans.xml)。如需添加新 BizModel 但codegen尚未生成,在app-service.beans.xml中手动添加 bean 定义。
不要默认传播的模式
- Spring
@Value - Spring
@Aspect/@Around样式的 AOP 示例 @Inject private Foo foo;
相关文档
./testing.md./debugging-and-diagnostics.md../04-reference/source-anchors.md