Skip to content
B1o0dy_Trey edited this page Feb 8, 2020 · 6 revisions

概述

@Inject是JSR330中的注解。@Resource是JSR250中的注解。容器会为@Inject标注的成员自动注入依赖。@Resource注解可以通过指定beanName为成员变量和setter方法注入依赖。此外,依赖必须存在于容器中,才能正确注入。有关配置文件的属性注入请查看JavaConfig篇。

@Resource注解的属性:

  • name:用于为成员变量和setter方法指定beanName注入依赖。

该注解只能标注在成员变量和setter方法上。

constructor

使用@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()的返回结果不为空。

field

需要注入的成员变量不能用final修饰,否则变量将无法被注入。

下面是使用@Inject注解自动注入的例子:

@Named
public class InjectFieldBean1{
    @Inject
    private Bean bean;
}

下面是使用@Resource注解指定beanName注入的例子:

@Named
public class InjectedFieldBean2{
    @Resource("bean")
    private Bean bean;
}

method

只有非抽象的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;
    }
}