web-dev-qa-db-fra.com

Comment convertir l'intégration Spring Bean de XML en Java Config basée sur les annotations

J'ai cette configuration basée sur xml. Mais dans mon projet, je veux utiliser Java configuration basée sur les annotations. Comment faire la conversion?

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="Host" value="mail.csonth.gov.uk"/>
    </bean>

    <bean id="registrationService" class="com.foo.SimpleRegistrationService">
        <property name="mailSender" ref="mailSender"/>
        <property name="velocityEngine" ref="velocityEngine"/>
    </bean>

    <bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
        <property name="velocityProperties">
            <value>
                resource.loader=class
                class.resource.loader.class=org.Apache.velocity.runtime.resource.loader.ClasspathResourceLoader
            </value>
        </property>
    </bean>

</beans>
8
sndu

Créez une classe annotée avec @Configuration (org.springframework.context.annotation.Configuration) Et pour chaque déclaration de bean dans votre fichier XML, créez une méthode @Bean (org.springframework.context.annotation.Bean) Dans cette classe.

@Configuration
public class MyConfiguration {

    @Bean
    public JavaMailSenderImpl mailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost("mail.csonth.gov.uk");
        return mailSender;
    }

    @Bean
    public SimpleRegistrationService registrationService(JavaMailSenderImpl mailSender, VelocityEngineFactoryBean velocityEngine) {
        SimpleRegistrationService registrationService = new SimpleRegistrationService();
        registrationService.setMailSender(mailSender);
        registrationService.setVelocityEngine(velocityEngine); 
        return registrationService; 
    }

    @Bean
    public VelocityEngineFactoryBean velocityEngine() {
        VelocityEngineFactoryBean velocityEngine = new VelocityEngineFactoryBean();
        Properties velocityProperties = new Properties();
        velocityProperties.put("resource.loader", "class");
        velocityProperties.put("class.resource.loader.class", "org.Apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        velocityEngine.setVelocityProperties(velocityProperties);
        return velocityEngine;
    }
}

Cet exemple suppose que les beans mailSender et velocityEngine sont requis ailleurs dans la configuration de votre application, car cela est impliqué par la configuration XML que vous avez fournie. Si ce n'est pas le cas, c'est-à-dire si les beans mailSender et velocityEngine sont niquement requis pour construire le bean registrationService alors vous n'avez pas besoin de déclarer les méthodes mailSender() et velocityEngine() comme public et vous n'avez pas besoin d'annoter ensuite avec @Bean.

Vous pouvez demander à Spring de lire cette classe de configuration en

  • Numérisation des composants, par ex. @ComponentScan("your.package.name")
  • Enregistrement de la classe avec un AnnotationConfigApplicationContext par exemple.

       AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
       context.register(MyConfiguration.class);
       context.refresh();
    
10
glytching

La réponse de @glitch a été utile mais j'ai eu une erreur en dessous de la ligne.

velocityEngine.setVelocityProperties("resource.loader=class", "class.resource.loader.class=org.Apache.velocity.runtime.resource.loader.ClasspathResourceLoader");

Comment je l'ai résolu. Vous trouverez ci-dessous la mise en œuvre complète

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import com.vlclabs.adsops.service.SendEmailServiceImpl;
import org.springframework.ui.velocity.VelocityEngineFactoryBean;

import Java.util.Properties;

@Configuration
public class EmailConfiguration {

    @Bean
    public JavaMailSenderImpl mailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost("mail.csonth.gov.uk");
        return mailSender;
    }

    @Bean
    public SendEmailServiceImpl registrationService(JavaMailSenderImpl mailSender, VelocityEngineFactoryBean velocityEngine) {
        SendEmailServiceImpl registrationService = new SendEmailServiceImpl();
        registrationService.setMailSender(mailSender);
        registrationService.setVelocityEngine(velocityEngine.getObject()); 
        return registrationService;
    }

    @Bean
    public VelocityEngineFactoryBean velocityEngine() {

        VelocityEngineFactoryBean velocityEngine = new VelocityEngineFactoryBean();
        Properties velocityProperties = new Properties();
        velocityProperties.put("resource.loader", "class");
        velocityProperties.put("class.resource.loader.class", "org.Apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        velocityEngine.setVelocityProperties(velocityProperties);

        return velocityEngine;
    }
}
1
sndu