복붙노트

[SPRING] 개인 생성자가있는 Java Spring bean

SPRING

개인 생성자가있는 Java Spring bean

빈에 대한 클래스에는 public 생성자가 없지만 private 클래스 만 사용할 수 있습니까? Bean 생성시이 개인 생성자가 호출됩니까? 감사.

해결법

  1. ==============================

    1.예, Spring은 private 생성자를 호출 할 수 있습니다. 가시성에 관계없이 올바른 인수를 사용하여 생성자를 찾으면 리플렉션을 사용하여 액세스 가능한 생성자를 설정합니다.

    예, Spring은 private 생성자를 호출 할 수 있습니다. 가시성에 관계없이 올바른 인수를 사용하여 생성자를 찾으면 리플렉션을 사용하여 액세스 가능한 생성자를 설정합니다.

  2. ==============================

    2.IoC 컨테이너의 기본 생성자에 의존하지 않고 항상 factory 메소드를 사용하여 bean을 작성할 수 있습니다. 인스턴스 팩토리 메소드를 사용한 인스턴스화 :

    IoC 컨테이너의 기본 생성자에 의존하지 않고 항상 factory 메소드를 사용하여 bean을 작성할 수 있습니다. 인스턴스 팩토리 메소드를 사용한 인스턴스화 :

    <!-- the factory bean, which contains a method called createInstance() -->
    <bean id="serviceLocator" class="com.foo.DefaultServiceLocator">
      <!-- inject any dependencies required by this locator bean -->
    </bean>
    
    <!-- the bean to be created via the factory bean -->
    <bean id="exampleBean"
          factory-bean="serviceLocator"
          factory-method="createInstance"/>
    

    이것은 bean을 위해 기본이 아닌 생성자를 사용할 수 있고 factory 메소드 bean의 의존성을 주입 할 수 있다는 장점이 있습니다.

  3. ==============================

    3.예, 개인 생성자는 봄에 의해 호출됩니다. 내 코드를 고려해보십시오.

    예, 개인 생성자는 봄에 의해 호출됩니다. 내 코드를 고려해보십시오.

    빈 정의 파일 :

    <bean id="message" class="com.aa.testp.Message">
            <constructor-arg index="0" value="Hi Nice"/>
        </bean>
    

    콩 클래스 :

    package com.aa.testp;
    
    public class Message {
    
        private String message;
    
        private Message(String msg) {
           // You may add your log or print statements to check execution or invocation
            message = msg;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public void display() {
            System.out.println(" Hi " + message);
        }
    
    }
    

    위의 코드는 정상적으로 작동합니다. 따라서 스프링은 private 생성자를 호출합니다.

  4. ==============================

    4.예 ! Spring은 private 생성자에 접근 할 수있다. 아래 코드와 같이 내부적으로 작동합니다.

    예 ! Spring은 private 생성자에 접근 할 수있다. 아래 코드와 같이 내부적으로 작동합니다.

           try{
        Class c= Class.forName("A"); // A - className
        Constructor c1[]=c.getDeclaredConstructors();
        c1[0].setAccessible(true);
        A a= (A)c1[0].newInstance();
        }
        catch (Exception e){
            e.printStackTrace();
        }
    
  5. ==============================

    5.그러한 bean에는 일반적으로 정적 팩토리 메소드가 있으며, spring에 해당 메소드를 지정하여 해당 bean의 인스턴스를 얻을 수 있습니다. 3.3.1.3 여기를 참조하십시오. 이것은 가시성 제한에 반하는 것이 아니라 Spring에서 권장하는 방식입니다.

    그러한 bean에는 일반적으로 정적 팩토리 메소드가 있으며, spring에 해당 메소드를 지정하여 해당 bean의 인스턴스를 얻을 수 있습니다. 3.3.1.3 여기를 참조하십시오. 이것은 가시성 제한에 반하는 것이 아니라 Spring에서 권장하는 방식입니다.

  6. from https://stackoverflow.com/questions/7254496/java-spring-bean-with-private-constructor by cc-by-sa and MIT license