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

  • 相关阅读:
    codeforces 459 C. Pashmak and Buses(思维)
    poj 2763 Housewife Wind(树链剖分+单点查询+区间修改)
    codeforces E. Phone Talks(dp)
    BZOJ 1036: [ZJOI2008]树的统计Count(树链剖分+单点更新+区间求和+区间求最大值)
    SPOJ
    hdu 3966 Aragorn's Story(树链剖分+区间修改+单点查询)
    codeforces H. Queries for Number of Palindromes(区间dp)
    codeforces 245 D. Restoring Table(位运算+思维)
    codeforces 402 D. Upgrading Array(数论+贪心)
    codeforces 793 D. Presents in Bankopolis(记忆化搜索)
  • 原文地址:https://www.cnblogs.com/Answer1215/p/9411139.html
Copyright © 2011-2022 走看看