Annotation 기반 Hibernate 3.3 + Spring 2.5 통합 개발


현재, 우 리 는 Spring 의 지원 에 가입 합 니 다. spring - framework - 2.5.5 \ dist 의 spirng. jar 를 우리 프로젝트 의 lib 디 렉 터 리 에 도입 하고, aspectjweaver. jar 패 키 지 를 추가 하여 절단면 프로 그래 밍 을 지원 합 니 다.
필요 한 프로필 은 다음 과 같 습 니 다:
applicationContext-common.xml
<?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

 	<!–   SessionFactory, Spring     Hibernate –>
    <!–  Annotation ,  org.springframework.orm.hibernate3.LocalSessionFactoryBean,
                  setMappingResources(), Hibernate Annotation       
          mapping resource,  mapping class,     LocalSessionFactoryBean   
        AnnotationSessionFactoryBean .  org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean        
          setAnnotatedClasses,   Hibernate  mapping class.          . –>
    <bean id=”sessionFactory”class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name=”configLocation”>
            			<value>classpath:hibernate.cfg.xml</value>
      		    </property>
    </brean>

 	  <!–         –>
       <bean id=”transactionManager”>
       		<property name=”sessionFactory”>
            		<ref bean=”sessionFactory” />
        	</property>
    	</bean>

 	<!–           –>
   	 <tx:advice id=”txAdvice” transaction-manager=”transactionManager”>
        		<tx:attributes>
            		<tx:method name=”save*” propagation=”REQUIRED” />
            		<tx:method name=”update*” propagation=”REQUIRED” />
            		<tx:method name=”delete*” propagation=”REQUIRED” />
            		<tx:method name=”*” read-only=”true” />
       	 	</tx:attributes>
   	 </tx:advice>

	<!–              –>
    	<aop:config>
        	<aop:pointcut id=”allServiceMethod” expression=”execution(* com.rong.dao.*.*.*(..))” />
        	<aop:advisor pointcut-ref=”allServiceMethod” advice-ref=”txAdvice” />
   	 </aop:config>
    
  	 <!–  Spring  Annotation –>
    	<context:annotation-config/>
    
   	 <!–  Spring            Bean –>
    	<context:component-scan base-package=”com.rong”/>

 	<!– 
    		<bean id=”userDao”>
        		<property name=”sessionFactory” ref=”sessionFactory”/>
    		</bean>
   		 <bean id=”userService”>
        		<property name=”userDao” ref=”userDao”/>
    		</bean>
     	–>
</beans>

     :
<!–  Spring  Annotation –>
<context:annotation-config/>
    
<!–  Spring            Bean –>
<context:component-scan base-package=”com.rong”/>
 

  
이렇게 설정 하면 위 에서 설명 한 DAO 층 과 Service 층 등 설정 코드 를 생략 합 니 다.편 하 죠?이 부분의 XML 코드 에 대하 여 우 리 는 다음 에 또 설명 할 것 이다.
 
우리 의 DAO 층 을 개발 합 시다. 인 터 페 이 스 는 다음 과 같 습 니 다.
 
 
package com.rong.dao;

import java.util.List;
import com.rong.entity.User;

public interface UserDao {
    
    public void save(User user);
    
    public void delete(int id);
    
    public void update(User user);
    
    public List<User> query();
    
    public User get(int id);

}

 
 
DAO 층 의 실현 클래스:
 
 
package com.rong.dao;

import java.util.List;
import org.springframework.stereotype.Repository;
import com.rong.entity.User;

@Repository(“userDao”)        //            
public class UserDaoBean extends MyHibernateDaoSupport implements UserDao {
    
    public void save(User user){
        super.getHibernateTemplate().save(user);
    }
    
    public void delete(int id){
        super.getHibernateTemplate().delete(super.getHibernateTemplate().load(User.class, id));
    }
    
    public void update(User user){
        super.getHibernateTemplate().update(user);
    }
    
    @SuppressWarnings(“unchecked”)
    public List<User> query(){
        return super.getHibernateTemplate().find(“from User”);
    }
    
    public User get(int id){
        return (User)super.getHibernateTemplate().get(“from User”, id);
    }

}

 
 보시 다시 피 저희 가 계승 한 것 은 HibernateDao Support 가 아니 라 제 가 직접 작성 한 MyHibernateDao Support 입 니 다.그 코드 는 다음 과 같다.
 
package com.rong.dao;

import javax.annotation.Resource;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class MyHibernateDaoSupport extends HibernateDaoSupport {
    
    @Resource(name=”sessionFactory”)    //   HibernateDaoSupport  sessionFactory  
    public void setSuperSessionFactory(SessionFactory sessionFactory){
        super.setSessionFactory(sessionFactory);
    }

}

 
 우리 가 HibernateDao Support 를 바 꾸 려 고 하 는 이 유 는 내 가 DAO 층 의 클래스 에 Session Factory 라 는 속성 을 주입 해 야 하기 때문이다.앞으로 우리 가 개발 한 DAO 류 는 이 MyHibernateDao Support 를 직접 다시 사용 할 수 있 습 니 다.사실 이렇게 하 는 것 은 파일 설정 방식 에 해당 하 는 코드 입 니 다.
 
<bean id=”userDao”>
     <property name=”sessionFactory” ref=”sessionFactory”/>
</bean>

 
 XML 파일 대신 annotation 을 사용 하려 면 원래 처럼 session Factory 를 사용 할 수 있 도록 해 야 하기 때문에 MyHibernate Dao Support 에 Session Factory 를 주입 합 니 다.하위 클래스 가 이 클래스 를 계승 할 때 도 Annotation 을 계승 한다.이렇게 하면 우 리 는 Session Factory 의 주입 을 실현 할 수 있다.
 
지금까지 애플 리 케 이 션 Context - comon. xml 의
 <bean id=”sessionFactory”>
        <property name=”configLocation”>
            <value>classpath:hibernate.cfg.xml</value>
        </property>
 </bean>

  
 우 리 는 평소에 Hibernate 와 Spring 통합 을 개발 할 때 org. springframework. orm. hibernate 3. Local Session Factory Bean 을 사용 하여 Session Factory 를 제공 하 는데, 우 리 는 org. springframework. orm. hibernate 3. annotation Session Factory Bean 으로 바 꿔 야 한다.사실은 이 렇 습 니 다. 저 희 는 Hibernate. cfg. xml 에서 설정 한 실체 클래스 맵 방식 은 다음 과 같 습 니 다.
<!–
<mapping resource=”com/rong/entity/User.hbm.xml”/>
<!–  Hibernate   User   ,         resource   –>
<mapping/>
–>

 
 Hibernate 의 실체 클래스 가 주 해 를 지원 하도록 하려 면 xxx. hbm. xml 파일 을 제거 해 야 합 니 다. 따라서 우 리 는 mapping class 방식 을 사용 합 니 다. mapping resource 방법 이 아 닙 니 다.그러나 LocalSession Factory Bean 과 같은 종 류 는 실체 클래스 맵 방식 으로 mapping resource 를 사용 합 니 다. (자세 한 내용 은 LocalSession Factory Bean 과 같은 소스 코드 를 참조 할 수 있 습 니 다)만약 우리 가 설정 에서 여전히 이 종 류 를 사용한다 면, Hibernate 와 Spring 을 통합 할 때, 오 류 를 보고 할 것 입 니 다.한편, AnnotationSession Factory Bean 과 같은 종 류 는 LocalSession Factory Bean 을 바탕 으로 mapping class 방식 으로 실체 클래스 맵 을 실현 합 니 다 (상세 한 것 은 AnnotationSession Factory Bean 류 의 소스 코드 참조).
 
서비스 층 의 코드 를 다시 보 겠 습 니 다.
 
package com.rong.service;

import java.util.List;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.rong.dao.UserDao;
import com.rong.entity.User;

@Service(“userService”)        //            
public class UserServiceBean implements UserService {
    
    @Autowired
    private UserDao userDao;

    public void save(User user){
        userDao.save(user);
    }

}

 우리 가 사용 하 는 주해 위 에 일반적으로 주석 을 달 았 으 니, 더 이상 서술 하지 않 는 다.Autowired 와 @ Resource 기능 의 차이 가 많 지 않 습 니 다. 대상 을 주입 하 는 것 은 < bean > 설정 에 해당 하 는 기능 입 니 다.
 
       좋아, 이렇게 개발 되 었 으 니 뭘 잊 어 버 린 거 아니 야?웹. xml, 부분 코드 를 설정 해 야 합 니 다.
 <!–   Spring        –>
       <context-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>classpath*:applicationContext-*.xml</param-value>
       </context-param>
    
       <!–   Spring –>
       <listener>
               <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
       </listener>

 
 사실, 지금까지 우 리 는 우리 의 XML 프로필 이 여전히 많다 는 것 을 알 았 다.사실, 이렇게 생각해 보면 지난 단계 에 우 리 는 xxx. hbm. xml 와 같은 파일 을 생략 했 습 니 다. 이 단 계 는 < bean id = "" "> < property name =" "ref =" > 와 같은 설정 항목 을 적 게 사 용 했 습 니 다.

좋은 웹페이지 즐겨찾기