zoukankan      html  css  js  c++  java
  • [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 ...).

  • 相关阅读:
    FastAPI 学习之路(十)请求体的字段
    FastAPI 学习之路(九)请求体有多个参数如何处理?
    FastAPI 学习之路(八)路径参数和数值的校验
    FastAPI 学习之路(七)字符串的校验
    FastAPI 学习之路(六)查询参数,字符串的校验
    【2021-09-09】被人说自大是有原因的
    【2021-09-08】连岳摘抄
    【2021-09-07】管理工作,得上下同步
    【2021-09-06】连岳摘抄
    【2021-09-05】连岳摘抄
  • 原文地址:https://www.cnblogs.com/Answer1215/p/9411139.html
Copyright © 2011-2022 走看看