본문 바로가기

JAVA/Spring

FactoryBean 사용

반응형

FactoryBean 사용

  • new 연산자로 생성할 수 없는 의존성을 어떻게 생성해 주입할때, 어댑터인 FactoryBean 인터페이스를 제공하여 사용한다.
  • 정적 팩터리 클래스로 접근해야 하는 객체처럼 new 연산자로 생성할수 없는 객체를 생성할때는 일반적으로 FactoryBean을 사용한다.
  • FactoryBean은 다른 빈을 생성하는 팩터리 역할을 담당
  • FactoryBean은 일반적인 빈과 마찬가지로 ApplicationContext에서 구성되지만 스프링이 FactoryBean 인터페이스를 사용해 의존성 요청이나 검색 요청에 응답할때는 일반적인 빈과 달리 FactoryBean 인스턴스를 반환하지 않는다. 대신 스프링이 FactoryBean.getObject() 메서드를 호출해 반환받는 결과를 반환한다.
  • 스프링에서 큰 역할을 담당하고, 트랜잭션 프록시나 JNDI 컨텍스트에 자동으로 리소스를 가져오는 것을 예로 들수 있다.

사용예

public class MessageDigestFactoryBean implements FactoryBean<MessageDigest>, InitializingBean {
    private String algorithmName = "MD5";

    private MessageDigest messageDigest = null;

    public MessageDigest getObject() throws Exception {
       return messageDigest;
    }

    public Class<MessageDigest> getObjectType() {
        return MessageDigest.class;
    }

    public boolean isSingleton() {
        return true;
    }

    public void afterPropertiesSet() throws Exception {
        messageDigest = MessageDigest.getInstance(algorithmName);
    }

    public void setAlgorithmName(String algorithmName) {
        this.algorithmName = algorithmName;
    }
}

public class MessageDigester {
    private MessageDigest digest1;
    private MessageDigest digest2;

    public void setDigest1(MessageDigest digest1) {
        this.digest1 = digest1;
    }

    public void setDigest2(MessageDigest digest2) {
        this.digest2 = digest2;
    }

    public void digest(String msg) {
        System.out.println("digest1 사용");
        digest(msg, digest1);

        System.out.println("digest2 사용");
        digest(msg, digest2);
    }

    private void digest(String msg, MessageDigest digest) {
        System.out.println("사용하는 알고리즘: " + digest.getAlgorithm());
        digest.reset();
        byte[] bytes = msg.getBytes();
        byte[] out = digest.digest(bytes);
        System.out.println(out);
    }
}

public class MessageDigesterConfigDemo {

    static class MessageDigestConfig {

        @Bean
        public MessageDigestFactoryBean shaDigest() {
            MessageDigestFactoryBean factoryOne =
                new MessageDigestFactoryBean();
                factoryOne.setAlgorithmName("SHA1");
                return factoryOne;
        }

        @Bean
        public MessageDigestFactoryBean defaultDigest() {
            return new MessageDigestFactoryBean();
        }

        @Bean
        MessageDigester digester() throws Exception {
            MessageDigester messageDigester = new MessageDigester();
            messageDigester.setDigest1(shaDigest().getObject());
            messageDigester.setDigest2(defaultDigest().getObject());
            return messageDigester;
        }
    }

    public static void main(String... args) {
        GenericApplicationContext ctx = new AnnotationConfigApplicatonContext(MessageDigestConfig.class);

        MessageDigester digester = (MessageDigester) ctx.getBean("digester");
        digester.digest("Hello World!");
        ctx.close();
    }
}

전문가를 위한 스프링 5
- 율리아나 코스미나, 롭해롭, 크리스 샤이퍼, 클라렌스 호 지음
- 이승룡, 김성윤, 서경석 옮김

 

반응형

'JAVA > Spring' 카테고리의 다른 글

빈 라이프 사이클 관리  (0) 2023.11.02
검증과 데이터바인딩  (0) 2022.01.28
AOP  (0) 2022.01.28
캐싱  (0) 2022.01.28
데이터베이스 연결  (0) 2022.01.05