-
Notifications
You must be signed in to change notification settings - Fork 17
Inject
B1o0dy_Trey edited this page Feb 8, 2020
·
6 revisions
@Inject是JSR330中的注解。@Resource是JSR250中的注解。容器会为@Inject标注的成员自动注入依赖。@Resource注解可以通过指定beanName为成员变量和setter方法注入依赖。此外,依赖必须存在于容器中,才能正确注入。有关配置文件的属性注入请查看JavaConfig篇。
@Resource注解的属性:
- name:用于为成员变量和setter方法指定beanName注入依赖。
该注解只能标注在成员变量和setter方法上。
使用@Inject注解标注构造方法,容器会自动寻找合适的类型对其进行依赖注入。需要注意的是,需要注入的构造方法只能存在一个。
下面是一个例子,首先在src/main/java/bean下配置一个bean:
@Named("bean")
public class Bean{}
然后在相同目录下编写一个具有依赖bean的构造方法的类:
@Named
public class InjectedBean{
private Bean bean;
@Inject
public InjectedBean(Bean bean) {
this.bean = bean;
}
public Bean getBean(){
return bean;
}
}
随后在src/main/java目录下的主方法中获取InjectedBean实例:
public class Example {
public static void main(String[] args) throws Exception {
AnnotationApplicationContext annotationApplicationContext = new AnnotationApplicationContext("bean");
annotationApplicationContext.start();
InjectBean bean = annotationApplicationContext.getBean(InjectBean.class);
System.out.println(bean.getBean());
}
}
输出结果如下
bean.Bean@30b8a058
可以看到,bean.getBean()的返回结果不为空。
需要注入的成员变量不能用final修饰,否则变量将无法被注入。
下面是使用@Inject注解自动注入的例子:
@Named
public class InjectFieldBean1{
@Inject
private Bean bean;
}
下面是使用@Resource注解指定beanName注入的例子:
@Named
public class InjectedFieldBean2{
@Resource("bean")
private Bean bean;
}
只有非抽象的setter方法才能注入依赖,注解的使用方法与成员变量相同
下面是使用@Inject注解的例子:
@Named
public class InjectedMethodBean1{
private Bean bean;
@Inject
public void setBean(Bean bean){
bean = this.bean;
}
}
下面是使用@Resource注解的例子:
@Named
public class InjectedMethodBean2{
private Bean bean;
@Resource("bean")
public void setBean(Bean bean){
bean = this.bean;
}
}