2013-12-20 3 views
2

Spring Application에서 XML 설정을 사용하고 있습니다. 이제 xml 구성 대신 주석 (예 : @service, @Repository 등)을 사용하도록 기존 클래스를 변환하고 싶습니다.Spring Annotation : XML 설정을 Annotation으로 변환하기

비즈니스 로직 (이해를 돕기 위해이 질문에는 적합하지 않습니다.) : 서비스는 미국 데이터베이스에 연결하여 skus (제품)를 찾고 skus를 비활성화합니다. 서비스는 EMEA 데이터베이스와 연결되어 skus (제품)를 찾고 skus를 비활성화합니다.

다음은 샘플 코드입니다.

/* Service code, which has 2 instances of SkuDAO, one connecting to US database and one connecting to EMEA database */ 

public class DeactivationService { 

    private static final Logger LOG = Logger.getLogger(DeactivationService.class); 

    private SkuDAO amerdao; //Dependency Injection Amer 
    private SkuDAO emeadao; //Dependency Injection EMEA 

    public DeactivationService(SkuDAO amerdao,SkuDAO emeadao) { 
     this.amerdao=amerdao; 
     this.emeadao=emeadao; 
    } 

    /* 
    * Step 1: find inactive sku in americas skudao1.find() 
    * Step 2: find inactive sku in emea skudao2.find() 
    * Step 3: deactivate sku in americas 
    * Step 4: deactivate sku in emea 
*/ 
    public void deactivateSku() { 
     List<Sku> totalList = new ArrayList<Sku>(); 
     List<Sku> amerList = amerdao.find(); 
     List<Sku> emeaList = emeadao.find(); 
       amerdao.deactivate(amerList); 
     emeaList.deactivate(emeaList); 
     } 

} 

/* DAO interface */ 

public interface SkuDAO { 
    public List<Sku> find(); 
    public void deactivate(List<Sku>); 
} 

/* DAO Implementation 
    Here one constructor in which DataSource is injected 

*/ 

    public class SkuDAOImpl implements SkuDAO { 

     private DataSource datasource; //Dependency injection 
     private JdbcTemplate jdbcTemplate; 

     public SkuDAOImpl(DataSource datasource) { 
      this.datasource=datasource; 
     } 

     public List<Sku> find() { 
      //some processing to find the sku, purposely left empty as it is a sample code 
     } 

     public void deactivate(List<Sku>) { 
      //some processing to deactivate the sku, purposely left empty as it is a sample code 
      } 
    } 

봄 구성 :

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:property-placeholder location="file:${dbconfiguration}"/> 

    <bean id="AmericasDataSource" class="dell.harmony.data.HarmonyBasicDataSource" destroy-method="close" > 
     <property name="url"><value>${HarmonyAmericasDb.url}</value></property> 
     <property name="driverClassName"><value>${HarmonyAmericasDb.driverClassName}</value></property> 
     <property name="username"><value>${HarmonyAmericasDb.username}</value></property> 
     <property name="password"><value>${HarmonyAmericasDb.password}</value></property> 
     <property name="initialSize"><value>${HarmonyAmericasDb.initialSize}</value></property> 
     <property name="maxActive"><value>${HarmonyAmericasDb.maxActive}</value></property> 
     <property name="maxWait"><value>${HarmonyAmericasDb.maxWait}</value></property> 
     <property name="maxIdle"><value>${HarmonyAmericasDb.maxIdle}</value></property> 
     <property name="minIdle"><value>${HarmonyAmericasDb.minIdle}</value></property> 
     <property name="removeAbandoned"><value>${HarmonyAmericasDb.removeAbandoned}</value></property> 
     <property name="removeAbandonedTimeout"><value>${HarmonyAmericasDb.removeAbandonedTimeout}</value></property> 
    </bean> 

    <bean id="EMEADataSource" class="dell.harmony.data.HarmonyBasicDataSource" destroy-method="close" > 
     <property name="url"><value>${HarmonyEMEADb.url}</value></property> 
     <property name="driverClassName"><value>${HarmonyEMEADb.driverClassName}</value></property> 
     <property name="username"><value>${HarmonyEMEADb.username}</value></property> 
     <property name="password"><value>${HarmonyEMEADb.password}</value></property> 
     <property name="initialSize"><value>${HarmonyEMEADb.initialSize}</value></property> 
     <property name="maxActive"><value>${HarmonyEMEADb.maxActive}</value></property> 
     <property name="maxWait"><value>${HarmonyEMEADb.maxWait}</value></property> 
     <property name="maxIdle"><value>${HarmonyEMEADb.maxIdle}</value></property> 
     <property name="minIdle"><value>${HarmonyEMEADb.minIdle}</value></property> 
     <property name="removeAbandoned"><value>${HarmonyEMEADb.removeAbandoned}</value></property> 
     <property name="removeAbandonedTimeout"><value>${HarmonyEMEADb.removeAbandonedTimeout}</value></property> 

    </bean> 

    **<!-- Sku Deactivation -->** 
    <bean id="SkuAmerDao" class="dell.harmony.service.skudeactivation.dao.SkuDAOImpl"> 
     <constructor-arg index="0"><ref bean="AmericasDataSource"/></constructor-arg> 
    </bean> 

    <bean id="SkuEMEADao" class="dell.harmony.service.skudeactivation.dao.SkuDAOImpl"> 
     <constructor-arg index="0"><ref bean="EMEADataSource"/></constructor-arg> 
    </bean> 

    <bean id="ServiceManager" class="dell.harmony.service.skudeactivation.service.DeactivationService"> 
     <constructor-arg index="0"><ref bean="SkuAmerDao"/></constructor-arg> 
     <constructor-arg index="1"><ref bean="SkuEMEADao"/></constructor-arg> 
    </bean>  

</beans> 

지금 내가 annodation로, XML ("SKU 비활성화") 안에 강조에 위의 클래스를 변환 할. 다음과 같이 convertion에 대한

내 코드입니다 : 예 'amerdao'이제 위의 생성자에서

@Service 
public class DeactivationService { 

    private static final Logger LOG = Logger.getLogger(DeactivationService.class); 

    private SkuDAO amerdao; //Dependency Injection Amer 
    private SkuDAO emeadao; //Dependency Injection EMEA 

    @Autowired(required=true) 
    public DeactivationService(@Qualifier("SkuAmerDao") SkuDAO amerdao, @Qualifier("SkuEMEADao") SkuDAO emeadao) { 
     this.amerdao=amerdao; 
     this.emeadao=emeadao; 
    } 

} 

, AmericasDataSource 및 EMEADataSource와 'emeadao'주입되어야한다, 어떻게 할까?

SkuDAOImpl에는 설정자가 없습니다. 또한 SkuDAOImpl에는 하나의 데이터 소스 인스턴스 만 있습니다.

  1. 당신은 주석이있는 SkuDAOImpl의 샘플 코드를 제공 할 수 있습니까?
  2. 더 나은 방법으로 수행 할 수 있다면 dao에 대한 서비스 코딩을 개선하기위한 제안. (대답하지 않아도 됨)

EDITED NOW : 질문 1에서 분명히하기 위해 Spring XML에서 아래의 두 행을 제거하고 대신 DeactivationService를 사용하고 싶습니다. 가능한가?

<bean id="SkuAmerDao" class="dell.harmony.service.skudeactivation.dao.SkuDAOImpl"> 
    <constructor-arg index="0"><ref bean="AmericasDataSource"/></constructor-arg> 
</bean> 

<bean id="SkuEMEADao" class="dell.harmony.service.skudeactivation.dao.SkuDAOImpl"> 
    <constructor-arg index="0"><ref bean="EMEADataSource"/></constructor-arg> 
</bean> 
+0

정확히 여기에 문제가 있습니까? – Anubhab

+0

@Anubhab, 나는 주석을 사용하고 AmericasDataSource (datasource, spring xml에서 참조)를 'amerdao'(DeactivationService 클래스의 인스턴스)에 삽입하고 emeadao (DeactivationService 클래스의 인스턴스)에 EMEADataSource (datasource, datasource, spring xml에서 참조)). – Raghu

+0

더 구체적으로 내 질문을 수정했습니다. – Raghu

답변

3

무엇에 대해 : 항상

@Service 
public class DeactivationService { 

    private static final Logger LOG = Logger.getLogger(DeactivationService.class); 

    @Autowired 
    @Qualifier("SkuAmerDao") 
    private SkuDAO amerdao; //Dependency Injection Amer 

    @Autowired 
    @Qualifier("SkuEMEADao") 
    private SkuDAO emeadao; //Dependency Injection EMEA 

    // no constructor needed. 
} 

public abstract class BaseDao implements SkuDAO { 

    private final JdbcTemplate jdbcTemplate;  

    protected BaseDao() { 
     this.jdbcTemplate = new JdbcTemplate(getDataSource()); 
    } 

    protected abstract DataSource getDataSource(); 

    public List<Sku> find() { 
     //some processing to find the sku, purposely left empty as it is a sample code 
    } 

    public void deactivate(List<Sku>) { 
     //some processing to deactivate the sku, purposely left empty as it is a sample code 
    } 
} 

@Repository("SkuAmerDao") 
public class SkuAmerDAOImpl extends BaseDao { 
    @Autowired 
    @Qualifier("AmericasDataSource") 
    private DataSource datasource; //Dependency injection 

    @Override 
    protected DataSource getDatasource() { 
     return dataSource; 
    } 
} 

@Repository("SkuEMEADao") 
public class SkuEMEADAOImpl extends BaseDao { 
    @Autowired 
    @Qualifier("EMEADataSource") 
    private DataSource datasource; //Dependency injection 

    @Override 
    protected DataSource getDatasource() { 
     return dataSource; 
    } 
} 

같은 원리 :

  • 클래스는 주석 @Service, @Component에 의해 빈을 만들어, @Repository (그 주석의 이름을 취할 수 값으로 bean)
  • 종속성 주입은필드에서 수행됩니다 0이고 두 개 이상의 해당 빈이있는 경우 (DataSource 두 개가 있음) @Qualifier을 추가하여 어느 것을 지정하십시오.

전체 설명서 here.

+0

우수. Upvoted. – Raghu