[JAVA] Appeler Spring Management Bean de Pojo

Chose que tu veux faire

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.

environnement

java8 javaee7 spring4.3.9 eclipse4.6

Plan de mise en œuvre

Le service que vous souhaitez appeler

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");
    }
}

Proposition 1 Accès statique au Spring Management Bean

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/

Proposition 2 @Configurable

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"

Si vous souhaitez exécuter avec eclipse au lieu de la commande maven

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.

Installation AJDT

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

Proposition 3 SpringBeanAutowiringInterceptor

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();
    }
}

Évaluation

Recommended Posts

Appeler Spring Management Bean de Pojo
Chaîne d'appels depuis la chaîne dans l'intégration Spring
Appeler Java depuis JRuby
Cycle de vie du haricot de printemps
1. Démarrez Spring Framework à partir de 1
Essayez Spring Boot de 0 à 100.
Spring's Bean Validaiton ~ Bean Bari Deshon ~