§@Inject
上一章节我们介绍了 @IocBean 可以将 Java 对象自动加入到 IoC 容器中进行管理。这一章我们将介绍 @Inject 注解,来实现对象的注入。
§1. 简单的例子
package jetbrick.docs.demo;
@IocBean
public class User {
    public String getName() {
        return "jetbrick";
    }
}
@IocBean
public class Hello {
    @Inject User user;
    public void says() {
        System.out.println("Hello " + user.getName());
    }
}
// 调用
public static void main(String args) {
    Ioc ioc = ...
    Hello hello = ioc.getBean(Hello.class);
    hello.says();
}
 
看清楚了吗?我们通过 @Inject 注解,我们已经将 User 对象成功的注入到了 Hello 对象中。
§2. @Inject 可配置的属性
value
要注入对象的名称 name,缺省情况下,将根据对应类型的完整类名作为 name。
@Inject java.sql.DataSource dataSource @Inject("mysql") java.sql.DataSource mysqlDataSource第一个 dataSource 将获取
ioc.getBean("java.sql.DataSource")这样的对象。required
表示如果注入的对象不存在,是否要抛出 NullPointerExpcetion。
默认情况下,
required=true
§3. 字段注入
就像我们上面看到的例子一样,我们用 @Inject 注入的是字段。
只要不是被声明成 final 的字段,IoC 都可以实现注入。不管是 public 的还是 private 的,亦或者是 static 的字段都没问题。
@Inject("log4j")
private Logger logger;
 
§4. 构造函数注入
除了最常见的字段注入之外,我们还提供了构造函数注入方式。
§4.1 指定构造函数
@IocBean
public class Hello {
    private User user;
    @Inject
    public Hello(User user) {
        this.user = user;
    }
    public void says() {
        System.out.println("Hello " + user.getName());
    }
}
 
通过将 @Inject 声明在构造函数上面,我们就可以使用指定的构造函数来初始化对象。
§4.2 默认构造函数
如果没有 @Inject 声明的构造函数,那么必须存在一个空的构造函数,并且是 public 的。
§4.3 构造函数参数注入
默认情况下,每个参数都缺省使用了 @Inject,如果我们需要自定义,那么我们可以给每个参数手动指定 @Inject。如下:
@IocBean
public class Test {
    private Foo foo;
    private Bar bar;
    @Inject
    public Hello(
        @Inject("foo") Foo foo,
        @Inject(required=false) Bar bar
    ) {
        this.foo = foo;
        this.bar = bar;
    }
}