lazy-init 造成的spring 注解方式启动定时器无效的问题

本文介绍了解决Spring框架中定时任务不执行的问题。通过调整default-lazy-init属性及使用@Lazy注解,成功实现了定时任务的正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目需要使用Spring的定时任务,按照网上的例子配置了注解,无法运行。但是用配置文件的方式运行正常,所以排除了依赖jar包出现的问题。

<bean id ="TestTask" class="test.TestTask" />
<task:scheduled-tasks>
<task:scheduled ref="TestTask" method="myTest" cron="0/5 * * * * ?" />
</task:scheduled-tasks>

好在搜索到了类似现象的提问:
[url]http://stackoverflow.com/questions/6154741/why-isnt-spring-running-my-scheduled-method[/url]

确定了是application-context中default-lazy-init="true" 这个设置的问题。spring迟延加载bean造成了定时任务无法执行。改为false后,运行正常。但这样修改影响到容器所有bean的加载,造成的效率问题未知。最后还是决定针对定时任务bean本身进行修改。用到了@LAZY这个之前没留意过的注解。


@Component
@Lazy(false)
public class TestTask {
### Spring框架中Bean作用域(Scope)的默认值 在Spring框架中,Bean的作用域(Scope)用于定义 Bean 的生命周期及其可见范围。若未显式指定 `@Scope` 注解XML 配置中的 `scope` 属性,则 Spring 会使用 `"singleton"` 作为默认作用域[^2]。 这意味着,在大多数情况下,Spring 容器将只为该 Bean 创建一个共享的实例,并在整个应用上下文中提供对该实例的引用。此行为适用于通过注解(如 `@Component`、`@Service`)或 XML 配置定义的 Bean,只要未明确设置其他作用域,都会以单例模式进行管理[^1]。 例如,以下 Java 注解配置中并未指定 `@Scope`: ```java @Component public class MyService { // 默认作用域为 singleton } ``` 在此示例中,`MyService` 将被 Spring 容器作为单例 Bean 管理,所有对该 Bean 的请求都将返回相同的实例[^2]。 同样地,在 XML 配置文件中省略 `scope` 属性时,默认也为 `singleton`: ```xml <bean id="myBean" class="com.example.MyBean"/> <!-- 等价于 scope="singleton" --> ``` 这种设计适用于无状态组件或需要全局共享的状态对象,是 Spring 中最常用的作用域之一[^4]。 --- ### 单例作用域的特点 - **唯一实例**:每个 Spring 应用上下文中仅存在一个该 Bean 的实例。 - **容器管理生命周期**:Bean 的创建和销毁由 Spring 容器控制,通常与上下文的启动和关闭同步。 - **资源共享**:适合存储全局状态或共享资源,如数据库连接池、缓存服务等。 --- ### 其他常见作用域简介 虽然 `singleton` 是默认作用域,Spring 还支持多种其他作用域,包括: - `prototype`:每次请求都会创建一个新的实例。 - `request`:每个 HTTP 请求拥有独立的 Bean 实例(仅限 Web 应用)。 - `session`:每个 HTTP Session 拥有一个独立的 Bean 实例(仅限 Web 应用)。 - `application`:每个 ServletContext 生命周期内只有一个实例(仅限 Web 应用)。 - `websocket`:每个 WebSocket 会话周期内只有一个实例(仅限 WebSocket 应用)。 这些作用域可以通过 `@Scope("prototype")` 或在 XML 配置中指定 `scope` 属性来启用[^3]。 --- ### 自定义作用域的注册方式 Spring 提供了扩展机制,允许开发者自定义作用域并通过 `ConfigurableBeanFactory#registerScope` 方法将其注册到容器中。例如: ```java ConfigurableBeanFactory beanFactory = ...; beanFactory.registerScope("customScope", new CustomScope()); ``` 该方法可用于实现特定业务场景下的作用域管理,如线程级作用域、任务作用域等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值