web-dev-qa-db-ja.com

Spring Bean統合をXMLからJavaアノテーションベースの構成に変換する方法

このxmlベースの構成があります。しかし、私のプロジェクトではJavaアノテーションベースの設定を使用したいと思います。変換を行う方法は?

 <?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

_@Configuration_(_org.springframework.context.annotation.Configuration_)で注釈が付けられたクラスを作成し、XMLファイル内の各Bean宣言に対して、このクラス内に_@Bean_(_org.springframework.context.annotation.Bean_)メソッドを作成します。

_@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;
    }
}
_

この例では、mailSenderおよびvelocityEngine Beanがアプリケーション構成の別の場所で必要であると想定しています。これは、提供されたXML構成によって暗黙的に指定されるためです。これが当てはまらない場合、つまりmailSenderおよびvelocityEngine Beanがonlyである場合、registrationService Beanを構築するために宣言する必要はありません。 mailSender()およびvelocityEngine()メソッドをパブリックとして使用することも、_@Bean_で注釈を付ける必要もありません。

この構成クラスを読み取るようにSpringに指示することができます

  • コンポーネントのスキャン。 @ComponentScan("your.package.name")
  • クラスをAnnotationConfigApplicationContextに登録します。

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

@glitchの回答は役に立ちましたが、以下の行でエラーが発生しました。

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

どのように私はそれを修正しました。以下が完全な実装です

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