• [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 ...).

  • 相关阅读:
    windows下运行命令行mysql,提示mysql不是内部命令,解决办法
    XML和HTML的区别
    BZOJ4695 最假女选手(势能线段树)
    BZOJ5312 冒险(势能线段树)
    洛谷P3959 宝藏(NOIP2017)(状压DP,子集DP)
    区间子集最大/最小异或和问题(线性基,树上差分)
    线性基模板(线性基)
    分数模板(C++模板)
    洛谷P2516 [HAOI2010]最长公共子序列(LCS,最短路)
    组合数学知识要点
  • 原文地址:https://www.cnblogs.com/Answer1215/p/9411139.html
Copyright © 2020-2023  润新知