0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Jakarta EEのContexts と Dependency Injection(CDI)を基本からまとめてみた【入門】

0
Last updated at Posted at 2026-01-04

Jakarta EEの概要

① エンタープライズJavaアプリケーション開発用のAPIの集まり

  • 仕様書・API・TCK(互換性テスト用ツールキット)の3点セット
  • Java EE → Jakarta EEと名称変更

② 互換性のある実装

Jakarta EEの概要

  • Jakarta EE Platform(フルスペック)
  • Jakarta EE Web Profile(Webアプリケーション)
  • Jakarta EE Core Profile(マイクロサービス用)

CDIの概要

  • 自動的に依存性注入ライフサイクル管理

CDI前

CDI.java
myService = new MyService();
myService = MyFactory.create();
myService = ctx.lookup("java・・・");
void doIt(MyService service) {
 :
}

⬇︎

CDI後

CDI.java
@Inject myService

@Inject

  • beans.xmlのbean-discovery-mode=allとannotated
src/main/java/META-INF/beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                           http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
       bean-discovery-mode="all">
    </beans>
App.java
package JakartaEE.cdi.example.sec1;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class App {

    public static void main(String[] args) {
        Weld weld = new Weld();
        try (WeldContainer container = weld.initialize()) {
            container.select(CDIApp.class).get().run();
        }
    }
}
CDIApp.java
package JakartaEE.cdi.example.sec1;

import jakarta.enterprise.context.Dependent;

@Dependent
public class CDIApp {

    @Inject
    private MyService myService;

    public void run() {
        System.out.println("Hello CDIApp sec01");
        System.out.println(this.myService.getMessage());
    }
}
MyService.java
package JakartaEE.cdi.example.sec1;

import jakarta.enterprise.context.Dependent;

@Dependent
public class MyService {

    public String getMessage() {
        return "Hello World";
    }
}
  • bean-discovery-mode
    ※ Bean: 再利用できるように部品化したjavaのクラス
annotated all
Defaultはこちら 全てのクラスがインジェクト対象
インジェクト対象のクラスに以下のアノテーションを付与 @Dependent等は省略できる
@Dependent
@~Scoped
@Interceptor

@Alternative

  • beans.xmlのAlternative
App.java
package JakartaEE.cdi.example.sec02;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class App {

    public static void main(String[] args) {
        Weld weld = new Weld();
        try (WeldContainer container = weld.initialize()) {
            container.select(CDIApp.class).get().run();
        }
    }
}
CDIApp.java
package JakartaEE.cdi.example.sec02;

import jakarta.enterprise.context.Dependent;

@Dependent
public class CDIApp {

    @Inject
    private MyService myService;

    public void run() {
        System.out.println("Hello CDIApp sec02");
        System.out.println(this.myService.getMessage());
    }
}
MyService1.java
package JakartaEE.cdi.example.sec02;

public interface MyService1 {

    String getMessage();
}
MyService2.java
package JakartaEE.cdi.example.sec02;

public class MyService2 implements MyService1 MyService
{

    @Override
    public String getMessage() {
        return "Hello World";
    }
}
MyService3.java
package JakartaEE.cdi.example.sec02;

@Alternative
public class MyService3 implements MyService {

    @Override
    public String getMessage() {
        return "Hello World";
    }
}

@Named

App.java
package JakartaEE.cdi.example.sec03;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class App {

    public static void main(String[] args) {
        Weld weld = new Weld();
        try (WeldContainer container = weld.initialize()) {
            container.select(CDIApp.class).get().run();
        }
    }
}
CDIApp.java
package JakartaEE.cdi.example.sec03;

import jakarta.enterprise.context.Dependent;

@Dependent
public class CDIApp {

    @Inject
    @Named("myService2")
    private MyService myService;

    public void run() {
        System.out.println("Hello CDIApp sec03");
        System.out.println(this.myService.getMessage());
    }
}
MyService1.java
package JakartaEE.cdi.example.sec03;

public interface MyService1 {

    String getMessage();
}
MyService2.java
package JakartaEE.cdi.example.sec03;

@Named
public class MyService2 implements MyService1 MyService{
    
    @Override
    public String getMessage() {
        return "Hello World";
    }
}
MyService3.java
package JakartaEE.cdi.example.sec03;

@Named
public class MyService3 implements MyService {

    @Override
    public String getMessage() {
        return "Hello World";
    }
}

@Qualifier, @Default

App.java
package JakartaEE.cdi.example.sec04;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class App {

    public static void main(String[] args) {
        Weld weld = new Weld();
        try (WeldContainer container = weld.initialize()) {
            container.select(CDIApp.class).get().run();
        }
    }
}
CDIApp.java
package JakartaEE.cdi.example.sec04;

import jakarta.inject.Inject;
import jakarta.inject.Named;

public class CDIApp {
    @Inject
    @Default
    @MyQualifier1
    private MyService myService;

    public void run() {
        System.out.println("Hello CDIApp sec04");
        System.out.println(this.myService.getMessage());
    }
}
MyService1.java
package JakartaEE.cdi.example.sec04;

public interface MyService1 {

    String getMessage();
}
MyService2.java
package JakartaEE.cdi.example.sec04;

@Default
@MyQualifier1
public class MyService2 implements MyService1 MyService{

    @Override
    public String getMessage() {
        return "Hello World";
    }
}
MyService3.java
package JakartaEE.cdi.example.sec04;

@MyQualifier2
public class MyService3 implements MyService {

    @Override
    public String getMessage() {
        return "Hello World";
    }
}
MyQualifier1.java
package JakartaEE.cdi.example.sec04;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Qualifier
@Retention(RUNTIME)
public class MyQualifier1 {

}
MyQualifier2.java
package JakartaEE.cdi.example.sec04;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Qualifier
@Retention(RUNTIME)
public class MyQualifier2 {

}

@Priority

App.java
package JakartaEE.cdi.example.sec05;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class App {
    public static void main(String[] args) {
        Weld weld = new Weld();
        try (WeldContainer container = weld.initialize()) {
            container.select(CDIApp.class).get().run();
        }
    }
}
CDIApp.java
package JakartaEE.cdi.example.sec05;

import jakarta.inject.Inject;

public class CDIApp {
    @Inject
    private MyService myService;

    public void run() {
        System.out.println("Hello CDIApp sec05");
        System.out.println(this.myService.getMessage());
    }
}
MyService1.java
package JakartaEE.cdi.example.sec05;

public interface MyService1 {

    String getMessage();
}
MyService2.java
package JakartaEE.cdi.example.sec05;

import jakarta.annotation.Priority;
import jakarta.enterprise.inject.Alternative;

@Alertnative
@Priority(10)
public class MyService2 implements MyService {

    @Override
    public String getMessage() {
        return "Hello World";
    }
}
MyService3.java
package JakartaEE.cdi.example.sec05;

import jakarta.annotation.Priority;
import jakarta.enterprise.inject.Alternative;

@Alertnative
@Priority(1)
public class MyService3 implements MyService {

    @Override
    public String getMessage() {
        return "Hello from MyService3";
    }
}

@Produces, @Disposes

App.java
package JakartaEE.cdi.example.sec06;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class App {

    public static void main(String[] args) {
        Weld weld = new Weld();
        try (WeldContainer container = weld.initialize()) {
            container.select(CDIApp.class).get().run();
        }
    }
}
CDIApp.java
package JakartaEE.cdi.example.sec06;

import jakarta.inject.Inject;
import jakarta.inject.Named;

public class CDIApp {
    @Inject
    @Default
    // @MyQualifier1
    private Set<MyService> myService;

    public void run() {
        System.out.println("Hello CDIApp sec06");
        System.out.println(this.myService.getMessage());
        this.myService.forEach(service -> System.out.println(service.getMessage()));
    }
}
MyQualifier1.java
package JakartaEE.cdi.example.sec06;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Qualifier
@Retention(RUNTIME)
public class MyQualifier1 {

}
MyQualifier2.java
package JakartaEE.cdi.example.sec06;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Qualifier
@Retention(RUNTIME)
public class MyQualifier2 {

}

MyService.java
package JakartaEE.cdi.example.sec06;

public class MyService {
    String getMessage();
}
MyService1.java
package JakartaEE.cdi.example.sec06;

import jakarta.enterprise.inject.Default;
import jakarta.enterprise.inject.Produces;

@MyQualifier1
public class MyService1 implements MyService {
    private final String message;

    public MyService1() {
        this.message = "Hello World";
    }

    public MyService1(String message) {
        this.message = "Hello World";
    }

    @Override
    public String getMessage() {
        return this.message;
    }

    @Produces
    @Default
    public MyService getMyService() {
        return new MyService1("@Produces");
    }
}
MyService2.java
package JakartaEE.cdi.example.sec06;

@MyQualifier2
public class MyService2 extends MyService1 {
    public MyService2() {
        super("Hello MyService2");
    }

    public String getMessage(String message) {
        super(message);
    }
}
MyProducer.java
package JakartaEE.cdi.example.sec06;

import jakarta.enterprise.inject.Produces;
import java.util.Set;

public class MyProducer {
    @Produces
    private Set<MyService> getMyServiceSet = Set.of(
            new MyService1("MyService1"),
            new MyService2("MyService2"))
}

@ApplicationScoped

App.java
package JakartaEE.cdi.example.sec07;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class App {
    public static void main(String[] args) {
        Weld weld = new Weld();
        try (WeldContainer container = weld.initialize()) {
            container.select(CDIApp.class).get().run();
        }
    }
}
CDIApp.java
package JakartaEE.cdi.example.sec07;

import jakarta.inject.Inject;

public class CDIApp {
    @Inject
    private MyService1 myService11;
    @Inject
    private MyService1 myService12;
    @Inject
    private MyService1 myService13;
    @Inject
    private MyService2 myService21;
    @Inject
    private MyService2 myService22;
    @Inject
    private MyService2 myService23;

    public void run() {
        System.out.println("Hello CDIApp sec07");
        List.of(this.myService11, this.myService12, this.myService13)
        .forEach(->{
            sv.countUp();
            System.out.println(sv.getMessage());
            });
        List.of(this.myService21, this.myService22, this.myService23)
        .forEach(->{
            sv.countUp();
            System.out.println(sv.getMessage());
            });
    }
}
MyService.java
package JakartaEE.cdi.example.sec07;

public class MyService {
    String getMessage();
}
MyService1.java
package JakartaEE.cdi.example.sec07;

import jakarta.enterprise.inject.Dependnt;

@Dependnt
public class MyService1 implements MyService {
    private int count = 0;

    public void countUp() {
        this.count++;
    }

    @Override
    public String getMessage() {
        return "Hello MyService1 count=" + this.count;
    }
}
MyService2.java
package JakartaEE.cdi.example.sec07;

import jakarta.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class MyService2 implements MyService {
    private int count = 0;

    public void countUp() {
        this.count++;
    }

    @Override
    public String getMessage() {
        return "Hello MyService2 count=" + this.count;
    }
}

@PostConstruct, @PreDestroy

App.java
package JakartaEE.cdi.example.sec08;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class App {
    public static void main(String[] args) {
        Weld weld = new Weld();
        try (WeldContainer container = weld.initialize()) {
            container.select(CDIApp.class).get().run();
        }
    }
}
CDIApp.java
package JakartaEE.cdi.example.sec08;

import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestory;
import jakarta.inject.Inject;

public class CDIApp {
    @Inject
    private MyService myService1;
    @Inject
    private MyService myService2;
    @Inject
    private MyService myService3;

    public void run() {
        System.out.println("Hello CDIApp sec08");
        System.out.println("this.myService1.getMessage()");
        System.out.println("this.myService2.getMessage()");
        System.out.println("this.myService3.getMessage()");
    }

    @PostConstruct
    public void postConstruct() {
        System.err.println("CDIApp sec08 @PostConstruct");
    }

    @PreDestory
    public void preDestory() {
        System.err.println("CDIApp sec08 @PreDestory");
    }
}
MyService.java
package JakartaEE.cdi.example.sec08;

import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestory;
import jakarta.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class MyService {
    String getMessage();return"Hello MyService sec08";

    @PostConstruct
    public void postConstruct(){
        System.err.println("MyService sec08 @PostConstruct");
    }

    @PreDestory
    public void preDestory(){
        System.err.println("MyService sec08 @PreDestory");
    }
}

@Observes, @ObservesAsync

App.java
package JakartaEE.cdi.example.sec09;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class App {
    public static void main(String[] args) {
        Weld weld = new Weld();
        try (WeldContainer container = weld.initialize()) {
            container.select(CDIApp.class).get().run();
        }
    }
}
CDIApp.java
package JakartaEE.cdi.example.sec09;

import jakarta.enterprise.event.Event;
import jakarta.inject.Inject;

public class CDIApp {
    @Inject
    private Event<MyService> event;

    public void run() {
        System.out.println("Hello CDIApp sec09");
        this.event.fire(new MyEvent("My event fired!"));
    }
}
MyEvent.java
package JakartaEE.cdi.example.sec09;

public class MyEvent {
    private final String message;

    public MyEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return this.message;
    }
}
MyObserver.java
package JakartaEE.cdi.example.sec09;

import jakarta.annotation.Priority;
import jakarta.enterprise.event.Observes;

public class MyObserver {
    public void onEvent1(@Observes @Priority(1) MyEvent event) {
        System.out.println("MyObserver.onEvent1 message " + event.getMessage());
    }

    public void onEvent2(@Observes @Priority(2) MyEvent event) {
        System.out.println("MyObserver.onEvent2 message " + event.getMessage());
    }
}

@Decorator, @Delegate

App.java
package JakartaEE.cdi.example.sec10;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class App {
    public static void main(String[] args) {
        Weld weld = new Weld();
        try (WeldContainer container = weld.initialize()) {
            container.select(CDIApp.class).get().run();
        }
    }
}
CDIApp.java
package JakartaEE.cdi.example.sec10;

import jakarta.inject.Inject;

public class CDIApp {
    @Inject
    private MyService myService;

    public void run() {
        System.out.println("Hello CDIApp sec10");
        System.out.println(this.myService.getMessage());
    }
}
MyService.java
package JakartaEE.cdi.example.sec10;

public interface MyService {

    String getMessage();
}
MyService1.java
package JakartaEE.cdi.example.sec10;

public class MyService1 implements MyService {

    @Override
    public String getMessage() {
        return "Hello MyService1";
    }
}
MyService2.java
package JakartaEE.cdi.example.sec10;

import jakarta.enterprise.inject.Decorator;
import jakarta.enterprise.inject.delegate.Delegate;
import jakarta.inject.Inject;

@Decorator
public class MyService2 implements MyService {

    @inject
    @Delegate
    private MyService myService;

    @Override
    public String getMessage() {
        return "@Decorator MyService2: " + this.myService.getMessage() + ;
    }
}

参考サイト

Jakarta EEシリーズその1:Contexts and Dependency Injection(CDI)入門

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?