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等
- 解説のみ:@Session,Conversation,RequestScoped,@Streotype
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() + ;
}
}