• 第三章 依赖注入" level="1"> 第三章 依赖注入
    • 1. 申明需要注入的对象" level="2">1. 申明需要注入的对象
      • 1.1 字段注入" level="3">1.1 字段注入
      • 1.2 构造器注入" level="3">1.2 构造器注入
      • 1.3 设置器(Setter)注入" level="3">1.3 设置器(Setter)注入
      • 1.4 方法参数注入" level="3">1.4 方法参数注入
    • 2. 手动获取对象实例" level="2">2. 手动获取对象实例
    • 3. 通过 Module 类声明绑定" level="2">3. 通过 Module 类声明绑定

    第三章 依赖注入" class="reference-link"> 第三章 依赖注入

    ActFramework支持基于JSR330的依赖注入.

    1. 申明需要注入的对象" class="reference-link">1. 申明需要注入的对象

    ActFramework通过javax.inject.Inject注解识别需要注入的对象. 你可以通过以下三种标准方式申明需要注入的对象:

    1.1 字段注入" class="reference-link">1.1 字段注入

    1. public class Foo {
    2. @Inject
    3. private Bar bar;
    4. }

    小贴士 字段注入最为简明,不过对单元测试会造成一些麻烦

    1.2 构造器注入" class="reference-link">1.2 构造器注入

    1. public class Foo {
    2. private Bar bar
    3. @Inject
    4. public Foo(Bar bar) {
    5. this.bar = bar;
    6. }
    7. }

    1.3 设置器(Setter)注入" class="reference-link">1.3 设置器(Setter)注入

    1. public class Foo {
    2. private Bar bar
    3. @Inject
    4. public void setBar(Bar bar) {
    5. this.bar = bar;
    6. }
    7. }

    1.4 方法参数注入" class="reference-link">1.4 方法参数注入

    方法参数注入和前面三种注入不一样, 是 ActFramework 特有的功能. Actframework支持三种方法参数注入:

    1. 请求处理方法
    2. 命令处理方法
    3. 任务方法

    当框架检测到响应函数参数列表中某个参数类型有依赖注入绑定,框架自动使用依赖注入提供该参数值

    1. @GetAction("xyz")
    2. public Result handleXyzRequest(String s, int i, ActionContext context, XyzDao dao) {
    3. ...
    4. }

    在上面的方法参数中, ActionContextXyzDao 两个类都是有依赖注入绑定的, 因此 contextdao 两个参数会被依赖注入, 而 si 则因为 Stringint 类没有依赖注入绑定而从请求参数中解析

    2. 手动获取对象实例" class="reference-link">2. 手动获取对象实例

    应用可以使用 Act.getInstance 静态方法来获取对象实例:

    1. // this ensure Bar has been injected into Foo
    2. Foo foo = Act.getInstance(Foo.class);

    3. 通过 Module 类声明绑定" class="reference-link">3. 通过 Module 类声明绑定

    如果你以前使用过guice,和通常的Guice应用一样,你可以创建Module类来申明注入绑定规则:

    1. public class GreetingModule extends org.osgl.inject.Module {
    2. @Override
    3. protected void configure() {
    4. bind(GreetingService.class).to(GreetingServiceImpl.class);
    5. }
    6. }

    小贴士 在ActFramework中你不必使用Module类来创建Injector对象实例。框架会自动寻找所有申明的Module类并在
    内部创建Injector实例

    返回目录