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

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/Answer1215/p/9411139.html
Copyright © 2011-2022 走看看