��4��@�^��EJB 3.0�‹���Spring��XDoclet�ō��



�����J�x�i�T���E�}�C�N���V�X�e���Y�j
2005/10/20

�@ Page.1 Page.2

�@��1��́uJSF�ESpring�EHibernate�Ŏ�����Java�ɔ�����v�ŏq�ׂ��悤�ɁAEJB 3.0�ł̓r�W�l�X�w�̃T�[�r�X�E�I�u�W�F�N�g��POJO�Ƃ��Ď����ł��܂��B�܂��AAOP�̋@�\�����p�”\�ƂȂ�A�r�W�l�X���W�b�N�Ɏ�������邱�ƂȂ��A����̑O������㏈�����r�W�l�X���W�b�N�ɐD�荞�ނ��Ƃ��ł���C���^�[�Z�v�^�[�𗘗p���邱�Ƃ��ł���悤�ɂȂ�܂��B

�@����́A��L�̂悤��EJB 3.0�Ɠ����̊‹����\�z���܂��B����Ȃ��Ƃ��ȒP�ɂł��邾�낤���A�Ƌ^��Ɏv����������邩������܂���B�������ASpring�t���[�����[�N��XDoclet�����p���邱�ƂŁA����قǍH�����|������EJB 3.0�ɂ��Ȃ�߂��J���‹���p�ӂ��邱�Ƃ��ł���̂ł��B

�@  �T�[�r�X�E�I�u�W�F�N�g��POJO�Ńf�U�C������


�@�����ł̖ڕW�́A�T�[�r�X�E�I�u�W�F�N�g��POJO�Ƃ��Ď����ł���悤�ɂ��邱�Ƃł��B���Ȃ킿�A�ȉ��̗�̂悤�ɁA����̊‹��⃉�C�u�����Ɉˑ������A�K�w���A�[�L�e�N�`���Ɋ�Â��ĕ��������ق��̃��C���̃R���|�[�l���g�Ƃ̈ˑ��֌W�́A�����̃C���^�[�t�F�C�X��`�݂̂ɂ���Ĉˑ�����悤�ɃT�[�r�X�E�I�u�W�F�N�g���`���܂��B

���X�g1�@CustomerService�C���^�[�t�F�C�X
public interface CustomerService {

    public List findCustomer(CustomerCriteria criteria);
    
    public List deleteCustomer(int id, CustomerCriteria criteria);
}

���X�g2�@CustomerService�̎����N���X
public class CustomerServiceImpl implements CustomerService {
    
    public List findCustomer(CustomerCriteria criteria) {
        return customerDAO.find(criteria.getName(),
                                criteria.getCompany());
    }
    
    public List deleteCustomer(int id, CustomerCriteria criteria) {
        customerDAO.delete(id);
        return findCustomer(criteria);
    }

    private CustomerDAO customerDAO;
    
    public void setCustomerDAO(CustomerDAO customerDAO) {
        this.customerDAO = customerDAO;
    }    
}

�@�ڋq���̌�����폜�̎��ۂ̏����́A�C���e�O���[�V�����w�̃f�[�^�E�A�N�Z�X�E�I�u�W�F�N�gCustomerDAO�ɈϏ����邽�߁ACustomerDAO��CustomerService�ɃC���W�F�N�V�������邽�߂�setter���\�b�h���p�ӂ��Ă��܂��BJava EE 5�‹������p�”\�ɂȂ�΁ACustomerDAO�̃C���W�F�N�V�����ɂ͈ȉ��̂悤��@Resource�A�m�e�[�V�����ɂ���ă��C�������O�ł���ł��傤�B

@Resource(name="CustomerDAO")
    public void setCustomerDAO(CustomerDAO customerDAO) {
        this.customerDAO = customerDAO;
    }    

�@J2EE 1.4�x�[�X�̌���ł́A�A�m�e�[�V�����̑���ɁASpring�t���[�����[�N��XML���^�f�[�^�𗘗p�������C�������O�ő�p���܂��B

<bean name="CustomerService"
        class="com.example.business.CustomerServiceImpl">
    <property name="customerDAO">
      <ref bean="CustomerDAO"/>
    </property>
</bean> 


�@  POJO�̃T�[�r�X�I�u�W�F�N�g��EJB�Ń��b�v����

�@�r�W�l�X�E�I�u�W�F�N�g��EJB�𗘗p���郁���b�g�́A��2��u����POJO�x�[�X�̃A�v���P�[�V�����E�f�U�C���v�ɂ��q�ׂ��Ƃ���J2EE 1.4�W���Z�p�ŁA�g�����U�N�V�����Ǘ��⃍�[���x�[�X�̃A�N�Z�X���䂪�����ł��邩��ł��B�����āAEJB�𗘗p�����r�W�l�X���W�b�N�ɂ́A�g�����U�N�V������A�N�Z�X����̃R�[�h�͈�؋L�q����K�v���Ȃ��‹������łɂ���킯�ł��B

�@�������AEJB�͓���̃C���^�[�t�F�C�X�i���Ȃ킿�ASessionBean�C���^�[�t�F�C�X�j���������A���߂�ꂽ���[���ɏ]���ă��\�b�h���������Ȃ���΂����܂���B����̏��Ȃ�POJO�x�[�X�f�U�C����EJB�̗D�ꂽ�@�\�̗����̃����b�g�𓾂邽�߂ɂ́A�T�[�r�X�E�I�u�W�F�N�g�̃r�W�l�X�E���\�b�h���f���Q�[�g�Ăяo������Z�b�V�����E�r�[����p�ӂ���΂悢���ƂɂȂ�܂��B

���X�g3�@CustomerServiceSessionBean.java
import org.springframework.ejb.support.AbstractStatelessSessionBean;
import javax.ejb.CreateException;

/**
 * @ejb.bean
 *        name="CustomerService"
 *        view-type="both"
 *        type="Stateless"
 *        jndi-name="ejb/CustomerService"
 *            :
 */
public class CustomerServiceSessionBean
    extends AbstractStatelessSessionBean {

    /** POJO�̃T�[�r�X�E�I�u�W�F�N�g */
    private CustomerService service;

    protected void onEjbCreate() throws CreateException {
        // BeanFactory����POJO�̃T�[�r�X�E�I�u�W�F�N�g���擾����
        service = (CustomerService) getBeanFactory().getBean(
            "CustomerService");
    }

    /**
     * @ejb.transaction type="Required"
     * @ejb.interface-method
     */
    public java.util.List findCustomer(CustomerCriteria criteria)  {
        // POJO�̃r�W�l�X�E���\�b�h���f���Q�[�g�ďo������
        return service.findCustomer(criteria);
    }
             :
}

�@���Ȃ킿�APOJO�̃r�W�l�X���\�b�h�ƑS�������V�O�l�`���̃��\�b�h��p�ӂ��A�Z�b�V�����E�r�[���̃r�W�l�X���\�b�h���Ăяo���ꂽ��APOJO�̃r�W�l�X���\�b�h��P�ɌĂђ����΂悢�̂ł��B��́A�Z�b�V�����E�r�[���ɂǂ̂悤�ɂ��āAPOJO�̃T�[�r�X�E�I�u�W�F�N�g�̎Q�Ƃ�^���Ă����邩���l����΂悢���ƂɂȂ�܂��B

�@Spring�t���[�����[�N�ɂ�javax.ejb.SessionBean�C���^�[�t�F�C�X�����������A�_�v�^�[�N���XAbstractStatelessSessionBean���p�ӂ���Ă��܂��B��L�̂悤�ɁAgetBeanFactory()���\�b�h���o�R���āASpring�Ǘ����̃r�[�����擾���邱�Ƃ��ł��܂��̂ŁA�����ł͂���𗘗p���邱�Ƃɂ��܂��傤�B

�@�Z�b�V�����r�[���̎�����Spring�t���[�����[�N�̃N���X�ւ̈ˑ��Ԋ֌W�������܂����AJava EE 5�ɂȂ�����APOJO�̃T�[�r�X�E�I�u�W�F�N�g�̎����������K�v�ɂȂ�A����EJB�̎����͎̂ĂĂ��܂��΂����킯�ł�����A�����ł�Spring��AbstractStatelessSessionBean�ւ̈ˑ����ɐ_�o���ɂȂ�K�v�͂Ȃ��ł��傤�B

�@�����܂łŗ��Ă��܂��΁AEJB�����ɕK�v�ȃ����[�g�^���[�J���C���^�[�t�F�C�X��z�[���C���^�[�t�F�C�X�A�f�v���C�����g�L�q�q�iejb-jar.xml�j�́AXDoclet�ɂ���Ď������������Ă����邱�Ƃ��ł��܂��B�ȉ��́Aant�R�}���h����XDoclet���Ăяo�����s��ł��B

$ ant ejb.xdoclet
Buildfile: build.xml

ejb.xdoclet:
:
BUILD SUCCESSFUL
Total time: 2 seconds

$ find build/ -type f
build/ejb/ejb-jar.xml
build/ejb/sun-ejb-jar.xml
build/generated/com/example/business/CustomerServiceLocal.java
build/generated/com/example/business/CustomerServiceLocalHome.java
build/generated/com/example/business/CustomerServiceRemote.java
build/generated/com/example/business/CustomerServiceRemoteHome.java
build/generated/com/example/business/CustomerServiceSessionBean.java

�@���ۂɂ́A��L�̊e��t�@�C���������������邽�߂ɂ́A���X�g3��CustomerServiceSessionBean�ɑ΂���XDoclet���F���ł��郁�^�f�[�^�i@�Ŏn�܂�javadoc�`���̃^�O�j�������‚��L�q����K�v������܂��B

�@XDoclet�ɕK�v��ant�r���h�t�@�C���̋L�q���@�ɂ‚��ẮA�T���v���R�[�h�̃A�[�J�C�u�t�@�C���Ɋ܂܂��build.xml�t�@�C�����Q�Ƃ��Ă��������B

�@  �J�X�^��Doclet��EJB��������������

�@���݂̂Ƃ���XDoclet�͂܂�JDK 1.5�̃A�m�e�[�V�����ɂ͑Ή����Ă��܂���B���̂��߁A���X�g3��EJB�{�̂�CustomerServiceSessionBean�����͎��Ƃō쐬����K�v������܂��B���̃N���X�͔�r�I�ȒP�Ɏ����ł��܂����A�A�v���P�[�V�����̋K�͂��傫���Ȃ��Ă���Ƃ���Ȃ�̍H�����������܂��B�܂��A�T�[�r�X�E�I�u�W�F�N�g�̃C���^�[�t�F�C�X���ύX�ɂȂ�΁A����ɓ�������EJB�̃C���^�[�t�F�C�X���C�����Ȃ���΂Ȃ�܂���B

�@�����ŁA��L��EJB���������̎d�g�݂�����i�߂āA���X�g3��EJB�{�̂������������邱�Ƃ��l���܂��B���������Java EE 5�Ɠ��l�AEJB��S���ӎ������ɁA�T�[�r�X�E�I�u�W�F�N�g��EJB�R���e�i�œ��삳���邱�Ƃ��ł���̂ł��B

�@�Z�b�V�����E�r�[���̎��������̓��̓f�[�^�Ƃ��ẮA���X�g1�̃T�[�r�X�E�C���^�[�t�F�C�X��XDoclet�̃g�����U�N�V����������A�N�Z�X���䑮�����܂񂾂��̂𗘗p���܂��B

���X�g4�@CustomerService�C���^�[�t�F�C�X
public interface CustomerService {

    /**
     * @ejb.transaction type="Required"
     */
    public List findCustomer(CustomerCriteria criteria);
    
    /**
     * @ejb.transaction type="Required"
     * @ejb.permission role-name="manager"
     */
    public List deleteCustomer(int id, CustomerCriteria criteria);
}          

�@Java�̃\�[�X�R�[�h��ǂݍ���ŕʂ̃\�[�X�t�@�C���𐶐����邽�߂ɂ́Ajavadoc�R�}���h��p�����A�J�X�^��Doclet���쐬����̂��ł��ȒP�ł��Bjavadoc�R�}���h��ant�R�}���h��������s�ł��܂��̂ŁA�ȉ��̂悤�Ȏg������z�肷����̂Ƃ��܂��B

���X�g5�@EJB�{�̂𐶐�����ant�^�[�Q�b�g�̒�`
  <target name="ejb.create" depends="compile"
          description="EJB�{�̂𐶐����܂�">
    <!-- Doclet�ɂ��AEJB�{�̂𐶐�            -->                
    <!-- (ex. Foo.java -> FooSessionBean.java) -->                
    <javadoc 
      failonerror="true" 
      encoding="${source.encoding}"
      verbose="true">                                         
      <doclet name="com.example.tool.CreateSessionBeanDoclet"
              pathref="class.path">                                      
        <param name="-dir" value="${gen.src.dir}"/>
        <param name="-context" value="application-context.xml"/>
      </doclet>                                                          
      <!-- Session Bean�𐶐�����ΏۃT�[�r�X�̃C���^�t�F�[�X -->        
      <fileset dir="${src.dir}" defaultexcludes="yes">
        <include name="**/*Service.java"/>
      </fileset>
      <classpath refid="class.path"/>
    </javadoc>
  </target>

�@�J�X�^��Doclet CreateSessionBeanDoclet��-dir�I�v�V�����ɂ͐��������Z�b�V�����E�r�[���̃\�[�X��ۑ�����f�B���N�g�����w�肵�A-context�I�v�V�����ɂ�EJB�R���e�i�Ŏg�p����Spring�̐ݒ�t�@�C�������w�肷����̂Ƃ��܂��B

�@�J�X�^��Doclet�̍쐬�͂���قǓ�����̂ł͂���܂���BDoclet��start�iRootDoc�j���\�b�h���`����ƁADoclet�ɓǂݍ��܂ꂽ�\�[�X�R�[�h��Java����i�r�Q�[�g���₷���`���ɂ������^�I�u�W�F�N�g�Ƃ��ăA�N�Z�X�ł���悤�ɂȂ�܂��B���^�I�u�W�F�N�g�́ARootDoc�𒸓_�Ƃ��āAClassDoc�i�N���X�̃��^�I�u�W�F�N�g�j�̔z�񂪎擾�ł��AClassDoc����MethodDoc�i���\�b�h�̃��^�I�u�W�F�N�g�j�̔z�񂪎擾�ł��܂��B�]���āAClassDoc�AMethodDoc�̃��^������ɃZ�b�V�����E�r�[���̃\�[�X�̒f�Ђ𐶐�����\�[�X�W�F�l���[�^�N���X�Ƃ��āA���ꂼ��ClassGenerator�N���X�AMethodGenerator�N���X��p�ӂ���΂悢���ƂɂȂ�܂��B

�}1 EJB���������̂��߂̃J�X�^��Doclet�̍\��

�@�\�[�X�R�[�h�̎��������Ƃ����Ă��A���ۂɂ͂��炩���ߗp�ӂ��Ă������e���v���[�g�t�@�C���̕ϐ��ɑ΂��āA����ꂽ���^�I�u�W�F�N�g�̏��𖄂ߍ���ł��������ł��B�Ⴆ�΁A�Z�b�V�����E�r�[���̃��\�b�h�����ɂ‚��ẮA�ȉ��̂悤�ȃe���v���[�g��p�ӂ��܂��B

���X�g6�@MethodGenerator�N���X�p�e���v���[�g
/**
     * %METHOD_COMMENT%
     *
     * %TAGS%
     * @ejb.interface-method
     */
    public %RETURN_TYPE% %METHOD_NAME%(%PARAM_SPEC%) %THROW_SPEC% {
        ContextUtil.setEJBContext(getSessionContext());

        %RETURN_STAT%service.%METHOD_NAME%(%PARAM_CALL%);
    }    

�@MethodGenerator�N���X��generate()���\�b�h���ł́A���X�g6�̃e���v���[�g��%�ϐ���%�̕��������^�I�u�W�F�N�g�̏��Œu�������Ă����܂��B

���X�g7�@MethodGenerator��generate()���\�b�h
class MethodGenerator {
    /** MethodDoc�F���\�b�h�̃��^�I�u�W�F�N�g */
    private MethodDoc methoddoc;
    /** ���\�b�h�E�e���v���[�g */
    private static String template;

    public String generate() {
        // MethodDoc����e���v���[�g�ϐ��p�̏����擾����
        String methodComment = methoddoc.commentText();
        String tags = generateTags();
        String returnType = methoddoc.returnType().toString();
        String methodName = methoddoc.name();
        String paramSpec = generateParamSpec();
        String throwSpec = generateThrowSpec();
        String returnStat = returnType.equals("void") ? "" : "return ";
        String paramCall = generateParamCall();

        // �e���v���[�g�̕ϐ��ɒl�𖄂߂�
        String gensrc = template;
        gensrc = gensrc.replaceAll("%METHOD_COMMENT%",  methodComment);
        gensrc = gensrc.replaceAll("%TAGS%",  tags);
        gensrc = gensrc.replaceAll("%RETURN_TYPE%", returnType);
        gensrc = gensrc.replaceAll("%METHOD_NAME%", methodName);
        gensrc = gensrc.replaceAll("%PARAM_SPEC%", paramSpec);
        gensrc = gensrc.replaceAll("%THROW_SPEC%", throwSpec);
        gensrc = gensrc.replaceAll("%RETURN_STAT%", returnStat);
        gensrc = gensrc.replaceAll("%PARAM_CALL%", paramCall);
        return gensrc;
    }
        :
}    

�@�����̃T���v���R�[�h�̃A�[�J�C�u�t�@�C���ɂ�CreateSessionBeanDoclet�̊��S�Ȏ������܂܂�Ă��܂��B��������Ă���README.txt�t�@�C���̓��e�ɏ]���āA�K�v�ȃ��C�u������z��������A�^�[�Q�b�gejb.create���w�肵��ant�R�}���h�����s���Ă݂ĉ������B���X�g3��EJB�{�̂̃\�[�X����������邱�Ƃ��m�F�ł���Ǝv���܂��B

$ ant ejb.create
Buildfile: build.xml
       :
ejb.create:
  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
       :
BUILD SUCCESSFUL
Total time: 4 seconds

$ find build/generated/ -type f 
build/generated/com/example/business/CustomerServiceSessionBean.java

�@ 1/2

�@INDEX

��4��@�^��EJB 3.0�‹���Spring��XDoclet����������
Page1
�T�[�r�X�E�I�u�W�F�N�g��POJO�Ńf�U�C������
POJO�̃T�[�r�X�I�u�W�F�N�g��EJB�Ń��b�v����
�J�X�^��Doclet��EJB��������������
�@ Page2
Spring�v���L�V�[�@�\�𗘗p����EJB�T�[�r�X�I�u�W�F�N�g���擾����
EJB 3.0�Ɉڍs�”\�ȃC���^�[�Z�v�^�[����������
Tomcat�ł��g�����U�N�V������A�N�Z�X����̓���m�F�����邽�߂ɂ�


Java Solution�S�L���ꗗ



Java Agile �t�H�[���� �V���L��
��IT���[���}�K�W���@�V������X�^�b�t�̃R���������[���œ͂��܂��i�����j

���ڂ̃e�[�}

Java Agile �L�������L���O

�{�� ����