반응형
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 |