Estoy actualizando mi aplicación de Spring 3.x a Spring 4.3. Y en lugar de la configuración xml, quiero la configuración java (anotación). No puedo hacer la configuración usando la anotación.
<task:executor id="executor" pool-size="8-25" queue-capacity="100" /> <task:scheduler id="scheduler" pool-size="10" /> <context:component-scan annotation-config="true" base-package="com.jobs"/> <task:annotation-driven executor="executor" scheduler="scheduler" />Dónde y cómo configurar la configuración anterior usando anotación. Y quiero aplicar la configuración xml anterior para seguir MyClassName.java
<bean id="mcn" class="com.jobs.MyClassName"> <property name="username" value="...."/> <property name="authorities"> <list> <value>....</value> </list> </property> </bean>Intenté como la siguiente configuración usando anotación pero obteniendo una excepción:
Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanInitializationException: Properties 'authorities' and 'username' are required for bean 'myClassName'MiNombreDeClase.java
@Component public class MyClassName{ @Value("CronUser") private String username; //@Value("#{'ROLE_SYSTEM'.split(',')}") @Value("#{'ROLE_SYSTEM'}") private List<String> authorities; @Required public void setUsername(final String aUsername) { username = aUsername; } @Required public void setAuthorities(final List<String> aAuthorities) { authorities = aAuthorities; } }SprinQuartzJobConfig.java
package com.config; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; @Configuration @EnableAsync @EnableScheduling @ComponentScan({"com.jobs"}) public class SpringQuartzJobConfig { @Bean public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(100); executor.setMaxPoolSize(8-25); executor.setQueueCapacity(100); executor.initialize(); return executor; } @Bean public Executor taskScheduler() { // set properties if required ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(10); return scheduler; } }¿Qué es la anotación para la configuración xml anterior?
Use @EnableScheduling y @EnableAsync respectivamente para reemplazar el programador y el ejecutor <task:annotation-driven> en la clase de configuración que se vería como a continuación
@Configuration @EnableAsync @EnableScheduling @ComponentScan({"com.jobs","com.my.package.second"}) public class DemoApplication { @Bean public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(100); executor.setMaxPoolSize(75); executor.setQueueCapacity(50); executor.initialize(); return executor; } @Bean public Executor taskScheduler() { // set properties if required return new ThreadPoolTaskScheduler(); } @Bean public MyClassName myClass() { MyClassName className = new MyClassName(); // set properties return className; } }Consulte los documentos aquí para obtener más detalles.
EDITAR ( error de publicación informado por OP )
Un par de cosas con respecto a MyClassName
@Configuration' & @ComponentScan with @Component` ya que debería ser un bean de primavera y no una configuración.@Autowired userName que su valor se proporciona a través @Valueauthorities de campo tampoco requieren @Autowired . Sin embargo, la sintaxis debe corregirse como @Value("#{'${ROLE_SYSTEM}'.split(',')}") si ROLE_SYSTEM se define en el archivo de propiedades como ROLE_SYSTEM=foo,bar,alpha,delta@Required deben eliminarse ya que esencialmente todos los campos @Autowired son obligatorios de forma predeterminada a menos que se especifique lo contrario a través @Autowired(required = false)