系统中有一个TimerTask,需要在系统启动时就执行,而该TimerTask中要用到一些Service(Service中还用到了Dao),系统是采用spring的注解的,如@Controller @Service @Repository等。
在web.xml中配置
<servlet>
<servlet-name>smcInitServlet</servlet-name>
<servlet-class>com.xxx.common.util.InitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
TimerTask就在此InitServlet中被创建执行的
MmsResendTimer mmsResend = new MmsResendTimer();
Timer mmsResendTimer = new Timer();
mmsResendTimer.schedule(mmsResend, 0, 1000 * 60 * 60);
结果是在启动系统时会报一个错
Exception in thread "Timer-0" java.lang.NullPointerException
原因是在该TimerTask中引用到了
@Autowired
@Qualifier("MMSTableService")
private MMSTableService mmsTableService;
而该Service在代码执行的时候是null
解决办法1:
在spring配置文件中显式的定义一个bean
<bean class="com.xxx.MMSTableServiceImpl">
然后在TimerTask引用的时候换一种定义Service的方式:
MMSTableServiceImpl mmsTableService = (MMSTableServiceImpl)ClassPathXmlApplicationContext.getBean(MMSTableServiceImpl.class);
解决办法2:
在InitServlet中删除创建TimerTask的代码,然后直接在spring配置文件中增加以下代码:
<bean class="com.xxx.protocolstack.mms.timer.MmsResendTimer" init-method="run"></bean>
在这里推荐使用第二种方式,比较简洁方便
不过要注意了,MmsResendTimer类里面一定要有默认的自构造方法
分享到:
相关推荐
### Spring注解 @Component、@Repository、@Service、@Controller 的区别 #### 一、引言 在现代软件开发中,尤其是Java领域的企业级应用开发中,Spring框架因其灵活、强大的依赖注入(DI)和面向切面编程(AOP)...
在Spring框架中,注解是实现服务暴露和远程调用(Remoting)的重要方式,它极大地简化了配置,提高了代码的可读性和可维护性。本文将深入探讨如何使用注解来实现Spring中的Remoting服务。 首先,让我们理解什么是...
`@PostConstruct`和`@PreDestroy`注解分别标识初始化和销毁方法,Spring会在Bean实例化后调用`@PostConstruct`方法,在销毁前调用`@PreDestroy`方法。 8. **生命周期回调** 除了初始化和销毁方法,Spring还提供了...
在上面的例子中,当Spring容器创建`myService` Bean时,会调用`init`方法进行初始化,而在Bean被销毁时调用`destroy`方法进行资源清理。 在转向注解配置之前,我们需要理解Spring的@Component、@Service、@...
当我们把`@Conditional`放在`@Configuration`类或`@Bean`方法上时,Spring容器会在启动时检查注解中的条件是否满足。如果条件满足,那么对应的Bean就会被注册到Spring容器中;如果不满足,该Bean就不会被创建和注入...
3. **构造函数注入**:除了字段和方法,`@Autowired`也可以用于构造函数,这样Spring会在创建bean实例时自动调用合适的构造函数,传入依赖的bean。 4. **可选注入**:通过设置`@Autowired`的`required`属性为`false...
如果注解在方法上,如`setUserDao`,Spring会在初始化bean时调用该方法进行注入。 2. **`@Autowired`的工作原理** 为了使`@Autowired`生效,我们需要在Spring配置文件中声明`AutowiredAnnotationBeanPostProcessor...
DWR (Direct Web Remoting) 是一个开源Java库,它允许在浏览器和服务器之间进行实时、双向通信,使得JavaScript可以直接调用服务器端的Java方法,实现了富客户端应用。Spring框架则是一个广泛使用的全面的企业级应用...
这个"hibernate+spring注解例子"项目提供了一个实际的登录场景,帮助学习者更好地理解和运用这两个框架的注解特性。通过深入学习和实践,开发者能够提高开发效率,降低出错概率,为构建高效、稳定的Java应用程序打下...
这样,当我们调用这个方法时,Spring会将其异步执行,而不是阻塞主线程。 @Async注解是Spring提供的一个强大工具,可以帮助我们提高系统的性能和响应速度。在实际项目中,使用@Async注解可以使得系统更加高效和可靠...
当事务方法被调用时,拦截器会检查方法上的`@Transactional`注解,根据其属性启动或加入合适的事务。 最后,Spring还支持自定义注解。你可以创建自己的注解,并使用`@ComponentScan`的`@Annotation`参数告诉Spring...
总结,非Controller注入Service方法是利用Spring的DI机制实现组件间的协作,而自启动方法则是通过`InitializingBean`接口或`@PostConstruct`注解在应用启动时执行特定逻辑。这两个特性使得Spring能够更好地管理对象...
Spring会在bean被创建后调用 @PostConstruct 注解的方法,而在bean销毁前调用 @PreDestroy 方法。 ```java @Component public class LifecycleComponent { @PostConstruct public void init() { System.out....
2. **@Before, @After, @AfterReturning, @AfterThrowing, @Around**: 这些是不同类型的通知,分别表示在方法调用前、后、正常返回后、抛出异常后以及环绕执行时执行的代码。 例如,`@Before`可以在方法执行前添加...
6. `@Bean`:这个注解用在方法上,表示该方法将返回一个bean实例,Spring会调用这个方法来初始化bean。 7. `@Import`:用来导入其他配置类,使得配置更加模块化。 8. `@EnableAspectJAutoProxy`:启用基于AspectJ...
`@Autowired`注入了UserService,使得在处理请求时可以直接调用服务层的方法。 总结起来,这个场景展示了如何通过Spring注解配置创建和管理中间层服务,以及如何在不依赖Struts2默认配置的情况下,使Struts2能够...
但是,如果在同一个类中的其他方法调用有@Transactional注解的方法时,Spring不会生成代理对象,导致事务不生效。 例如,以下代码中,dosome()方法上有@Transactional注解,但是如果在action()方法中调用dosome(),...
### Spring注解驱动开发知识点详解 #### 一、Spring注解驱动概述 Spring框架通过引入注解支持,极大地简化了Java EE应用的开发工作。它不仅提供了基础的依赖注入功能,还增强了对组件扫描的支持,使得开发者能够...
Spring RMI服务是一种在Java平台上实现远程方法调用(Remote Method Invocation, RMI)的技术,它允许分布式系统中的不同组件通过网络进行通信。在Spring框架的支持下,我们可以更方便地将服务发布为RMI服务,使得...
例如,使用`@Component`、`@Autowired`等Spring注解,可以将服务提供者和消费者对象注入到其他业务逻辑组件中。此外,Spring的AOP(面向切面编程)能力也能帮助我们更好地实现服务的监控和日志记录。 在这个demo中...