Frage

Eigentlich ist dies keine Frage, aber wirklich brauche ich Ihre Meinung in einer Angelegenheit ... Ich habe seinen Posten hier, weil ich weiß, Sie ist immer aktiv, so wenden Sie sich bitte dies eine schlechte Frage nicht betrachten Sie und teilen Sie mir Ihre Meinung.

habe ich Java dynamische Proxies zu zentralisieren Den Code der PPV verwendet, dass ich in einem Standalone-Modus verwendet und ist hier der dynamische Proxy-Code:

package com.forat.service;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import com.forat.service.exceptions.DAOException;

/**
 * Example of usage :
 * <pre>
 * OnlineFromService onfromService = 
 *            (OnlineFromService) DAOProxy.newInstance(new OnlineFormServiceImpl());
 *        try {
 *            Student s = new Student();
 *            s.setName("Mohammed");
 *            s.setNationalNumber("123456");
 *            onfromService.addStudent(s);    
 *        }catch (Exception ex) {
 *            System.out.println(ex.getMessage());
 *        }
 *</pre>
 * @author mohammed hewedy
 *
 */
public class DAOProxy implements InvocationHandler{

    private Object object;
    private Logger logger = Logger.getLogger(this.getClass().getSimpleName());

    private DAOProxy(Object object) {
        this.object = object;
    }

    public static Object newInstance(Object object) {
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), 
                    object.getClass().getInterfaces(), new DAOProxy(object));
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        EntityManagerFactory emf = null;
        EntityManager em = null;
        EntityTransaction et = null;
        Object result = null;
        try {
            emf = Persistence.createEntityManagerFactory(Constants.UNIT_NAME);
            em = emf.createEntityManager();;
            Method entityManagerSetter = object.getClass().
                getDeclaredMethod(Constants.ENTITY_MANAGER_SETTER_METHOD, EntityManager.class);
            entityManagerSetter.invoke(object, em);
            et = em.getTransaction();
            et.begin();
            result = method.invoke(object, args);
            et.commit();
            return result;
        }catch (Exception ex) {
            et.rollback();
            Throwable cause = ex.getCause();
            logger.log(Level.SEVERE, cause.getMessage());
            if (cause instanceof DAOException)
                throw new DAOException(cause.getMessage(), cause);
            else
                throw new RuntimeException(cause.getMessage(), cause);
        }finally {
            em.close();
            emf.close();
        }
    }
}

Und hier ist der Link, der mehr info ( http://m-hewedy.blogspot.com/2010/04/using-dynamic-proxies-to-centralize-jpa.html )

Also, bitte geben Sie mir Ihre Meinung.

Danke.

War es hilfreich?

Lösung

So ermitteln Sie die Transaktionsdemarkation Logik in einem Ort und die Verwendung dynamischer Proxy verkapselt hat bestehende Dienste mit Transaktionsmanagement zu verbessern und vorformulierten Code zu reduzieren, nicht wahr?

Das klingt ziemlich OK für mich. Eigentlich, was Behälter wie Spring oder EJB tun, wenn wir sprechen von deklarative Transaktionsdemarkation ist sehr ähnlich. Die Umsetzung weist, können Sie es mit dynamischen Proxy tun, oder Byte-Code-Instrumentierung oder sogar AspectJ verwenden. Ich habe etwas sehr ähnlich einmal für einen kleinen Test-Framework einmal. Hier ist eine Blog-Post über sie.

Die kniffligen Teile, die ich sehe, sind:

1) Zurücksetzen nur . Wie pro JPA-Spezifikation kann eine Entität Transaktion markiert werden „ Rollback nur “. Eine solche Transaktion kann nie begehen. Also ich mag das Gefühl, sollten Sie, dass zwischen diesen beiden Linien überprüfen:

result = method.invoke(object, args);
et.commit();

2) Neueintritt . Die meisten Systeme, die deklarative Transaktion eine Semantik implementieren, in dem eine Transaktion nur dann gestartet wird, wenn es nicht ein bereits aktiv (siehe „Required“ in dieser Liste der EJB Anmerkungen ). Sieht aus wie Sie vielleicht mit isActive überprüfen soll, dass in Ihrer Logik.

3) Ausnahmebehandlung . Seien Sie sehr vorsichtig mit der Ausnahme Ausbreitung in dynamischen Proxy. Der Proxy sollte für die Kunden so viel wie möglich transparent sein. Wenn eine Ausnahme anders als DAOException der DAO austritt, wird der Proxy in eine RuntimeException verwandeln. Nicht optimal für mich klingen. Auch nicht verwechseln die Ausnahme, weil invoke nicht, und die durch die Anrufung gewickelte Ausnahme, dass ich glaube, Sie sollten wieder throw wie sie ist:

catch ( InvocationTargetException e )
{
     Throwable nested = e.getTargetException();
     throw nested;
}

Fazit : Die Idee in diesem Szenario klingt OK mir dynamisches Proxy zu verwenden. Aber ich vermute, es gibt ein paar stopft doppelte Kontrolle in Ihrem Code (ich erinnere mich nicht alle Details der JPA-Spezifikationen und Ausnahme mit dynamischen Proxy-Handling, aber es gibt einige schwierige Fälle). Diese Art von Code kann geringfügige Fehler verbergen, so lohnt es sich Zeit zu nehmen, um es kugelsicher.

Andere Tipps

Ich habe etwas ähnliches in der Vergangenheit verwendet, sondern auf die Hibernate-API codiert (dies wurde vorge JPA). Der Datenzugriff für die meisten Arten von DAO wurde durch eine Schnittstelle nach dem Objekttyp namens verwaltet, zum Beispiel CustomerPersistence für Customer instnaces verwalten. Methoden wie findXXX abgebildet benannten Abfragen mit Parameternamen in der Methode, um Parameter in der Abfrage zugeordnet.

Die Implementierung der Schnittstellen waren Proxies, die den Namen der Schnittstelle verwendet, Methodennamen, Parameternamen etc .. geeignete Methoden in der Hibernate-API aufrufen.

Es spart eine Menge Textcodierung, mit einer intuitiven Zuordnung zu dem zugrunde liegenden Datenzugriff Rahmen und sorgt für sehr leicht von der Datenzugriffsschicht spöttisch.

Also, ich bin auf jeden Fall "Daumen nach oben" auf Proxies.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top