Puisqu'il y a des cas occasionnels où vous souhaitez appeler un bean de gestion de printemps d'une classe qui n'est pas gérée par spring, nous allons résumer la méthode d'implémentation.
java8 javaee7 spring4.3.9 eclipse4.6
Accès statique au bean de gestion Spring
@Configurable
SpringBeanAutowiringInterceptor
Notez que la troisième méthode est limitée à Java EE.
Le service que vous souhaitez appeler
package com;
import org.springframework.stereotype.Service;
@Service
public class TestService {
public void execute(){
System.out.println("com.TestService#execute");
}
}
Créez un bean de gestion Spring qui contient le ApplicationContext et accédez-y depuis pojo via la méthode statique.
Bean de gestion de printemps qui contient ApplicationContext
package com.bridge;
import com.TestService;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringContextBridge implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Autowired
private TestService testService;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public static SpringContextBridge getInstance() {
return applicationContext.getBean(SpringContextBridge.class);
}
public TestService getTestService() {
return testService;
}
}
classe de pojo
package com.bridge;
public class SpringContextBridgeClient {
public static void main(String[] args) {
SpringContextBridge.getInstance().getTestService().execute();
}
}
Site de référence https://blog.jdriven.com/2015/03/using-spring-managed-bean-in-non-managed-object/
Lors de la compilation avec AspectJ, remplacez la nouvelle partie de la classe par @Configurable (probablement, je suppose parce que je n'ai pas vérifié la source).
@Une classe qui devient un bean de gestion de printemps avec Configurable
package com.configurable;
import com.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
@Configurable
public class ConfigurableClient {
@Autowired
private TestService testService;
public void execute() {
testService.execute();
}
}
classe de pojo
package com.configurable;
public class Configurable {
public static void main(String[] args) {
//Même s'il est généré par du neuf, ce sera DI!
new ConfigurableClient().execute();
}
}
application-context.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
<context:spring-configured/>
<context:component-scan base-package="com.configurable"/>
<context:annotation-config />
</beans>
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test1</groupId>
<artifactId>artifact1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>artifact1</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<aspectj.version>1.6.12</aspectj.version>
<spring.version>4.3.9.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.4</version>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<configuration>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
compiler et exécuter avec maven
mvn clean compile
mvn exec:java -Dexec.mainClass="com.configurable.Configurable"
Lorsque vous ouvrez pom.xml avec eclipse, vous devriez voir l'erreur suivante.
Exécution de plugins non couverts par la configuration du cycle de vie: org.codehaus.mojo: aspectj-maven-plugin: 1.4: compile (exécution: par défaut, phase: compile)
Vous devez inclure AJDT pour pouvoir utiliser la compilation d'aspectj.
"Aide" - "Installation d'un nouveau logiciel" - "http://www.eclipse.org/ajdt/downloads/"
Sélectionnez et installez "AspectJ Development Tools" (AJDT)
Si vous installez d'autres options ensemble, une erreur se produira dans la procédure suivante, il semble donc bon de n'installer AJDT qu'une seule fois.
Cliquez sur l'erreur dans pom.xml Installez le connecteur avec "Découvrir un nouveau connecteur m2e"
Maintenant vous pouvez le faire!
Site de référence http://ryu-htn.hatenablog.com/entry/2013/04/25/151240 https://github.com/kenyattaclark/Spring-Configurable-Example https://tamasgyorfi.net/2013/11/13/spring-dependency-injection-configurable/
Site de référence (erreur d'éclipse) http://tyru.hatenablog.com/entry/20140905/eclipse_lifecycle_error
Utilisez l'intercepteur de JavaEE et le SpringBeanAutowiringInterceptor de Spring. Voici un exemple d'utilisation de la classe EJB comme bean de gestion Spring. (Bien sûr, il n'est pas nécessaire qu'il s'agisse d'EJB. @Stateless et @Remote sont des annotations EJB, vous pouvez donc les supprimer.)
Classe EJB
package com.autowired;
import com.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
@Stateless
@Remote
@Interceptors(SpringBeanAutowiringInterceptor.class)
public class TestEjb {
@Autowired
private TestService testService;
public void execute() {
testService.execute();
}
}
Si vous utilisez javaEE, je pense que "Proposition 3 SpringBeanAutowiringInterceptor" est la plus simple et la meilleure.
Si vous n'utilisez pas javaEE, "Proposition 1 Accès statique au bean de gestion Spring" est bon.
Au début, "Proposition 2 @Configurable" semblait être une bonne solution, mais il semble y avoir un problème pour remplacer toutes les nouveautés (comme le test simulé). Considérant que la bibliothèque AspectJ doit être ajoutée, "Proposition 1 Accès statique au bean de gestion Spring" semble être plus simple et meilleure.