[JavaEE] Injecting Bean

So what is a Bean, in JavaEE, any class expect Entity are Bean. 

One usefully thing in Bean is Dependency injection. Just like Angular, it is just a Class.

package com.pluralsight.bookstore.utils;

public class TextUtil {
    public String sanitize(String textToSanitize) {
        return textToSanitize.replaceAll("\s+", " ");
    }
}

Using TextUtil class:

@Transactional(SUPPORTS)
public class BookRepository {

    // ======================================
    // =          Injection Points          =
    // ======================================

    @Inject
    private TextUtil textUtil;

    // For creating and deleting methods, we want to use REQUIRED
    @Transactional(REQUIRED)
    public Book create(@NotNull Book book) {
        book.setTitle(textUtil.sanitize(book.getTitle()));
        em.persist(book);
        return book;
    }

}

TextUtil is implementation. For DI, we can not only inject an implementation class, we can also inject an Interface.

package com.pluralsight.bookstore.utils;

public interface NumberGenerator {
    String generateNumber();
}

But just have interface with implementation, code won't work, we still need to implement generateNumber().

package com.pluralsight.bookstore.utils;

import java.util.Random;

public class IsbnGenerator implements NumberGenerator{
    @Override
    public String generateNumber() {
        return "13-843546-" + Math.abs(new Random().nextInt())
    }
}

Using Injection:

@Transactional(SUPPORTS)
public class BookRepository {

    // ======================================
    // =          Injection Points          =
    // ======================================

    @Inject
    private NumberGenerator generator;

    @Transactional(REQUIRED)
    public Book create(@NotNull Book book) {
        book.setIsbn(generator.generateNumber());
        book.setTitle(textUtil.sanitize(book.getTitle()));
        em.persist(book);
        return book;
    }
}

Still to make Injection works, we need bean.xml file:

webapp/WEB-INF/beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="all">
</beans>

The reason why create NumberGenerator as an interface and IsbnGenerator to implement NumberGenerator:

Because we can generate different kinds of number format. IsbnGenerator is one of them.

In order to follow Dependency Inversion principle & Open and Closed principle, we want to create an abstract interface (numberGenerator) with multi different implementations (isbngenerator ...).

原文地址:https://www.cnblogs.com/Answer1215/p/9411139.html