Warum Spring ' s @Konfigurierbare funktionieren manchmal und manchmal nicht?
Ich versuche, verwenden Sie das automatische dependency injection über Spring @Konfigurierbare annotation w/@Resource auf den Feldern benötigen, Injektion. Dies beinhaltete einige setup -, wie die übergabe spring-agent.jar zu meinem JVM. Für die vollen details siehe hier.
Funktioniert es... meistens. Wenn mein Tomcat hochfährt, sehe ich die AspectJ-init-Nachrichten, meine Benutzer-Objekte automatisch FileService-Verweise, etc.
Das problem ist, dass es manchmal einfach nicht passieren. Es scheint völlig zufällig zu sein; manchmal kann ich Booten und die Abhängigkeiten sind nicht gespritzt, manchmal sind Sie das. Ich hatte vorher Probleme mit der @Transactional auf meinem Benutzer, denn es entstand ein Konflikt, ich glaube, mit proxies. Ich bin mit JPA, also mein Benutzer ist gekennzeichnet mit @Entity, also meine beste Vermutung ist jetzt, dass dies einen Konflikt zu verursachen. Ich habe gelesen, Sie können nicht automatisch proxy ein proxy. Zum Ausgleich der Konflikt, folgte ich einige Notizen, die ich online gefunden über die ohne CGLIB und javassist die Hibernate (meine JPA-impl) verwendet.
Hinweise:
- Es um alles oder nichts. Alle meine @Konfigurierbaren Instanzen wurden injiziert oder keiner von Ihnen.
- Nachladen (reinstantiating) der Entität, von der DB scheint nicht zu helfen; es ist entweder arbeiten oder nicht.
- Neustart von Tomcat eine beliebige Anzahl der Zeit auch gar nicht vor, es zu beheben. Die einzige Sache, die angezeigt wird, Rollen Sie die Würfel wieder erneut bereitstellen. In anderen Worten, wenn ich umschichten kann es funktionieren.
Wie kann ich herausfinden, was schief läuft? Ist jemand mit @Configurable mit JPA? Warum ist nicht mein dependencyCheck = true werfen einen Fehler, wenn die Abhängigkeiten nicht eigentlich gespritzt?
Person
@Entity
@Configurable(dependencyCheck = true)
@NamedQueries( { @NamedQuery(name = "User.findAll", query = "SELECT user FROM User user"),
@NamedQuery(name = "User.findByEmail", query = "SELECT user FROM User user WHERE user.email = :email") })
public abstract class User extends BaseModel {
private static final long serialVersionUID = 7881431079061750040L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
@Column(unique = true, nullable = false)
private String email;
@Basic(optional = false)
private String password;
@Resource
private transient UserEmailer userEmailer;
@Resource
private transient FileService fileService;
...
aop.xml
<!DOCTYPE aspectj PUBLIC
"-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<weaver options="-verbose">
<include within="com.myapp.domain..*" />
<exclude within="*..*CGLIB*" />
<exclude within="*..*javassist*" />
</weaver>
<aspects>
<aspect name="org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect" />
</aspects>
</aspectj>
applicationContext.xml
...
<context:spring-configured />
<context:load-time-weaver />
<context:component-scan base-package="com.myapp" />
...
Angesichts all der änderungen, die sich auf den Frühling, gibt es jetzt eine bessere Lösung für dieses problem?
InformationsquelleAutor Robert Campbell | 2009-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst muss ich sagen, dass es wahrscheinlich nicht eine gute Idee zu haben, Ressourcen, Dienstleistungen oder andere beans injiziert Daten-Modell-Klassen als Abhängigkeiten. Aber das ist eine Frage der Gestaltung.
Die Verwendung von @Configurable ich habe es in Fällen, in denen Objekte instanziiert, die von außerhalb der Spring-Kontext wie benutzerdefinierte tags in web-Anwendungen, Filter oder servlets. Die erste Möglichkeit, die ich habe versucht, Sie zu nutzen, war von load-time-weaving wie Sie tun. Das klappte auch ganz gut, aber es hatte einige Nachteile, wie hot-code-deployment beim Debuggen nicht mehr funktioniert.
Habe ich auch Erfahrung genau das problem, das Sie beschreiben, und so habe ich beschlossen, wechseln von load-time weaving zur Kompilierzeit. Dafür habe ich installiert, die AJDT-plugin in Eclipse und benutzt die aspecjt support des Frühlings. Das löste meine Probleme.
die "sehr guten Buch" meinst du? klingt interessant ...
Das Buch ist Domain-Driven Design von Eric Evans. Ich erfuhr es durch eine Empfehlung von Martin Fowler in Patterns of Enterprise Application Architecture, das ist ein weiteres wirklich tolles Buch.
InformationsquelleAutor Thomas Einwaller
Für mich klingt es wie ein Ereignis von einem bekannten bug im Frühling: http://jira.springframework.org/browse/SPR-5401.
Kann es sein, dass Sie versuchen, zu verwenden, können in mehreren anwendungskontexten? In diesem Fall ist nur einer von Ihnen wird vorbehaltlich der dependency injection. Was der eine gewinnt, hängt davon ab, welche Anwendung der Kontext ist die Letzte, die geladen werden.
Lösung? Keine 🙁 Es gibt keine Pläne, um dieses Problem zu beheben. Das ist zumindest das, was die SpringSource Kerl erzählt in der JAX-Konferenz im April in Deutschland.
InformationsquelleAutor jens
Können nicht vor Ort etwas klar sein, deshalb nur ein Vorschlag - haben Sie versucht, mit compile-time-weaving? Hoffentlich würde führen zu konsistenten Ergebnissen zur Laufzeit, obwohl es sein kann ein bisschen mehr Aufwand bei der Entwicklung.
InformationsquelleAutor James
Wenn die Einspritzung nicht funktioniert, aus welchem Grund auch immer, es gibt keine Möglichkeit, code zu tun, alle Abhängigkeiten überprüfen, so gibt es nun Fehler geworfen.
Sonst kann ich nichts sehen hier, dass würde bedeuten, die zufälligen Fehler. Können Sie extrahieren ein Vereinfachtes Beispiel, um zu überprüfen?
Gibt es einen Grund, warum Sie mit @Konfigurierbar über @ - Komponente?
Laut der Dokumentation, Sie würden beide erreichen die gleiche Sache hier. Ich benutze @Komponente für DI Injektion von Spring-verwaltete beans, während ich @Config für DI-Injektion auf non-Spring-verwaltete beans. So, obwohl, Sie würden beide arbeiten, ich benutze die verschiedene, zu Hinweis auf die Frühjahr status einer Bohne.
InformationsquelleAutor Jörn Zaefferer
Es klingt wie dein deploy-Prozess ist verdächtig. Können Sie eine Implementierung, die funktioniert, dann kopieren Sie Sie, dass Sie zu einem Verzeichnis. Dann das andere tun-Bereitstellung, bis Sie eine, die nicht funktioniert. (In beliebiger Reihenfolge) und Dann endlich, verwenden Sie ein tool wie beyond compare, vergleichen Sie die beiden deployment directory-Strukturen und-Dateien, und sehen, ob es irgendwelche Unterschiede gibt.
Glück, nichts, wie ein scheinbar zufälliges problem zu töten Produktivität.
Ja, ich bin an einem Projekt, wo ich mit einer Reihe von neuen Technologien. Sie sind selten, die Produktivität zu verbessern, bis Sie machen es über den Berg. Ich habe gar nicht versucht zu Gesicht spring annotierten Eigenschaften. Zu viele neue Dinge, und die xml funktioniert jedes mal.
InformationsquelleAutor Nathan Feger