§@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;
}
}