如何将spring bean集成从XML转换为基于Java注释的Config

snd*_*ndu 6 java xml spring javabeans

我有这个基于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>
Run Code Online (Sandbox Code Playgroud)

gly*_*ing 9

创建一个用@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

此示例假定应用程序配置中的其他位置需要mailSendervelocityEnginebean,因为您提供的XML配置暗示了这一点.如果不是这种情况,即如果mailSendervelocityEnginebean 需要构造registrationServicebean,那么你不需要将mailSender()velocityEngine()方法声明为public,也不需要使用它进行注释@Bean.

您可以指示Spring读取此配置类

  • 组件扫描例如 @ComponentScan("your.package.name")
  • 使用AnnotationConfigApplicationContext例如注册课程

       AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
       context.register(MyConfiguration.class);
       context.refresh();
    
    Run Code Online (Sandbox Code Playgroud)