스프링 타 입 변환기

7225 단어 spring
매우 간단 하기 때문에 원칙 은 설명 하지 않 고 속성 변환기 와 차이 가 많 지 않 으 며 전체적인 유형 을 대상 으로 합 니 다.
Spring 설정 은 다음 과 같 습 니 다.

<bean id="customConvertConfigurer"
		class="org.springframework.context.ConvertsBeanFactoryPostProcessor">
		
		<property name="converters">
			 <list>
			 	<ref bean="dataConverter" />
			 </list>
		</property> 
	</bean>
	
	<bean id="dataConverter" class="org.springframework.context.DateConverter" >
			<property name="formats">  
				<list>
					<value>yyyy-MM-dd</value>
					<value>yyyy-MM-dd HH:mm:ss</value>
				</list>
			</property> 
	</bean>

설명 하지 않 습 니 다. 원본 코드 는 다음 과 같 습 니 다.

package org.springframework.context;

import java.util.List;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.support.DefaultConversionService;

public class ConvertsBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
	
	public List<Converter<?, ?>> converters;
 
 
	public void setConverters(List<Converter<?, ?>> converters) {
		this.converters = converters;
	} 
	
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		DefaultConversionService dcs = new DefaultConversionService();
		for(Converter<?, ?> converter:converters){
			dcs.addConverter(converter);
		}
		beanFactory.setConversionService(dcs);
	}

}

여러분 착각 하지 마 세 요. spring 소스 코드 에는 이런 종류 가 없어 요. 직접 쓴 거 예요.

package org.springframework.context;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.springframework.core.convert.converter.Converter;

public class DateConverter implements Converter<String, Date>{
	
	private List<String> formats; 
	
	public void setFormats(List<String> formats) {
		this.formats = formats;
	} 

	public Date convert(String text) { 
		Date date = null;
		try {
			SimpleDateFormat sdf = null; 
			if(text.length() == 10){
				sdf = new SimpleDateFormat((String)formats.get(0));
			}else if(text.length() == 19){
				sdf = new SimpleDateFormat((String)formats.get(1));
			} 
			date= sdf.parse(text); //        
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}

}

인 터 페 이 스 는 간단 합 니 다. 범 형 을 지원 합 니 다. 모든 종류의 변환 을 지원 합 니 다. 변환 하기 전에 spring 은 자동 으로 String, Date 에 따라 유형 변환기 의 key 를 생 성 한 다음 이 key 에 따라 유형 변환 기 를 가 져 옵 니 다.
그래서 그 는 속성 변환기 보다 우수 하고 속성 변환 기 는 목표 유형 에 따라 일치 합 니 다.
형식 변환기 인 터 페 이 스 는 간단 하고 범 형 을 사용 하여 확장 성 이 강하 다.
테스트 코드 는 다음 과 같 습 니 다:

		TestBean tt = (TestBean)xct.beanFactory.getBean("jenny");
		System.out.println(tt.getAge());
		System.out.println(tt.getName());
		System.out.println(tt.getDateValue()); 

유형 변환 기 는 Spring 의 등록 체제 가 속성 변환기 와 비슷 한 것 을 제외 하고 (더 좋 음) Spring 프레임 워 크 에서 쉽게 사용 할 수 있 습 니 다.
코드 를 조금 만 수정 해 주세요.

package org.springframework.context;

import java.util.List;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.support.DefaultConversionService;

public class ConvertsBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
	
	public List<Converter<?, ?>> converters;
	
	public ConversionService conversionService;
 
 
	public void setConverters(List<Converter<?, ?>> converters) {
		this.converters = converters;
	} 
	
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		DefaultConversionService dcs = new DefaultConversionService();
		for(Converter<?, ?> converter:converters){
			dcs.addConverter(converter);
		}
		beanFactory.setConversionService(dcs);
		conversionService = beanFactory.getConversionService();
	}
	
	/**
	 *                
	 * 
	 * @param source
	 * @param target
	 * @return
	 */
	public boolean canConverter(Class<?> sourceType,Class<?> targetType){ 
		return conversionService.canConvert(sourceType, targetType); 
	}
	
	/**
	 *       
	 * 
	 * @param source
	 * @param target
	 * @return
	 */
	public Object convert(Object source,Class<?> targetType){
		return conversionService.convert(source, targetType);
	}

}


테스트 코드 는 다음 과 같 습 니 다.

ConvertsBeanFactoryPostProcessor cbf = (ConvertsBeanFactoryPostProcessor)xct.beanFactory.getBean("customConvertConfigurer");
		cbf.canConverter(String.class, Date.class);
		System.out.println(cbf.convert("2011-01-11", Date.class));

이런 디자인 원 리 는 매우 간단 하 다. 유형 변환기 의 등록 과 사용 은 Spring 내부 에서 사용 하 든 외부 에서 사용 하 든 모두 가능 하 다.이러한 디자인 원리 에 따 르 면 현재 데이터베이스 my sql, Oacle, hbase. mongdb 등의 유형 은 자바 의 사용자 정의 유형 과 일치 하지 않 고 Convert 를 만 들 수 있 으 며 유형 호 환 을 할 수 있 습 니 다.
물론 spring 도 등록 방법 을 제공 합 니 다. 못 생기 게 쓰 여 있 습 니 다.

    <bean id="conversionService" class=
            "org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <ref bean="dataConverter" />
            </list>
        </property>
    </bean> 

얼마나 못 생 겼 는 지, 얼마나 못 생 겼 는 지, 이런 코드 의 로드 는 스프링 의 디자인 전 체 를 오염 시 킬 수 있다.

if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
				beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
			beanFactory.setConversionService(
					beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
		}

코드 가 강하 게 의존 합 니 다. beanName 은 conversionService 가 되 어야 자동 으로 등록 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기