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

  • 相关阅读:
    idea如何使用git关联远程仓库
    项目首次上传至git仓库步骤
    Eclipse 的 Java Web 项目环境搭建
    Postman
    Postman接口测试之POST、GET请求方法
    接口测试3A原则
    使用unittest和ddt进行数据驱动
    每天进步一点点006
    每天进步一点点005
    Selenium2+python自动化1-环境搭建(悠悠课程之路)
  • 原文地址:https://www.cnblogs.com/Answer1215/p/9411139.html
Copyright © 2011-2022 走看看