开发技术 / Technology
    您的当前位置:网站首页 > 行业洞察 > 开发技术

    Java EE CDI 依赖注入 (@Inject) 教程

    日期:2015年2月25日  作者:zhjw  来源:互联网    点击:693

    在本教程中,你将会学到几种不同的方法,用@Inject注解来实现Java EE CDI方式的依赖注入。

     

    1. 简介

    Java EE CDI 主要使用@Inject注解来实现依赖注入,把受管理的bean注入到由容器管理的其它资源中去。在本教程中,我们将会介绍在CDI环境下几种不同的可选策略来实现依赖注入。

    本教程基于如下环境:

    1. JDK 1.7.0.21
    2. Weld 1.1.10

    Weld 是CDI 的参考实现。

    2. 构造器依赖注入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class SomeBean {
       
      private final Service service;
     
      @Inject
      public SomeBean(Service service){
        this.service = service;
      }
     
    }

    当CDI容器在初始化一个SomeBean类型的bean实例时,它将会查找该类的默认构造器(无参构造器)并用它来创建bean实例。但是有一个例外情况,就是当我们还有一个使用@Inject 进行了注解的构造器时,这种情况下,容器会改用有注解的构造器而不是无参构造器,并且把通过构造器参数传入的依赖资源注入到bean实例中来。

    在上面的例子中,容器将会获取到一个Service 的实例并把它注入到SomeBean 的注解构造器中.

    注意: 记住一个类只允许有 一个@Inject注解的构造器。
     

    3. 字段依赖注入

    1
    2
    3
    4
    5
    6
    public class SomeBean {
       
      @Inject
      private Service service;
     
    }

    这种情况下,当容器初始化一个 SomeBean类型的bean时,它会把一个正确的Service实例注入给该字段,即使该字段是一个私有字段,并且不需要有任何setter方法。

    4. 初始化方法依赖注入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class SomeBean {
       
      private Service service;
       
      @Inject
      public void setService(Service service) {
        this.service = service;
      }
     
    }

    这种情况下,当容器初始化一个 SomeBean类型的bean时,它会调用所有由@Inject注解了的方法,并且通过方法参数的方式把依赖注入进来。

    5.  @Any 修饰符

    为了提供完全松耦合的应用,我们通常把接口注入到受管理的资源中。当我们有多个实现了给定接口的bean时该怎么办呢?我们可以同时使用@Any修饰符和CDI的Instance接口,来把所有该接口的实现bean都注入进一个受管理的bean中: