解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题

SimpleAsyncTaskExecutor:每次都将创建新的线程.

解决办法:

在xml配置文件里添加redis线程池

<bean id="springSessionRedisTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
            <!-- 核心线程数 -->
            <property name="corePoolSize" value="10" />
            <!-- 最大线程数 -->
            <property name="maxPoolSize" value="300" />
            <!-- 队列最大长度 -->
            <property name="queueCapacity" value="500" />
            <!-- 线程池维护线程所允许的空闲时间,默认为60s -->
            <property name="keepAliveSeconds" value="60" />

</bean>

### Spring 面试常见问题及答案 #### 1. **什么是 Spring 框架?** Spring 是一个轻量级的 Java 开发框架,旨在简化企业应用开发过程。它提供了一个全面的基础架构支持,使开发者能够专注于业务逻辑而无需担心底层细节[^1]。 --- #### 2. **Spring 的设计核心是什么?** Spring 的设计核心主要包括两个方面:控制反转(IoC)和面向切面编程(AOP)。IoC 容器负责管理对象的创建和依赖关系,而 AOP 提供了一种机制来分离横切关注点[^2]。 --- #### 3. **IOC 和 AOP 面试题** - **IOC(Inversion of Control, 控制反转)** IOC 表示将对象的创建权交给容器,而不是由程序手动创建。这种模式减少了耦合度并提高了可测试性和灵活性。 - **AOP(Aspect-Oriented Programming, 面向切面编程)** AOP 将应用程序中的通用功能(如日志记录、事务管理等)从业务逻辑中分离出来,从而提高代码的模块化程度[^3]。 --- #### 4. **Spring 的优点和缺点** - **优点** - 轻量级:低侵入性设计使得现有应用易于集成 Spring 功能。 - 松散耦合:通过 IoC 实现组件之间的松散耦合。 - 方便测试:支持 JUnit 测试框架,便于单元测试。 - **缺点** - 学习曲线陡峭:初学者可能需要花费较长时间熟悉其复杂配置。 - 性能开销:某些场景下(如大量代理操作),可能会引入额外性能消耗[^2]。 --- #### 5. **Spring 中 Bean 的作用域** Spring 支持五种主要的作用域: - `singleton`:默认作用域,表示每个 Spring 容器只有一个实例。 - `prototype`:每次请求都会生成新的 Bean 实例。 - `request`:针对 Web 应用,在一次 HTTP 请求期间有效。 - `session`:在整个会话周期内共享同一个 Bean 实例。 - `application`:全局范围内唯一的一个 Bean 实例。 --- #### 6. **Spring 中 Bean 的注入方式** 主要有三种常见的注入方式: - 构造函数注入:适用于强制性依赖项。 - Setter 方法注入:用于非必需属性设置。 - 注解驱动注入:例如使用 `@Autowired` 或者 `@Resource` 自动装配所需 Bean[^1]。 --- #### 7. **BeanFactory 和 ApplicationContext 的区别** | 特性 | BeanFactory | ApplicationContext | |---------------------|------------------------------------|--------------------------------------| | 初始化时机 | 延迟加载 | 立即加载 | | 功能范围 | 较少 | 更强大,支持事件发布等功能 | | 使用场景 | 对于小型项目或者资源受限环境 | 推荐大多数实际应用场景 | ApplicationContext 还提供了国际化消息解析以及上下文监听器的支持[^2]。 --- #### 8. **循环依赖的情况,怎么解决?** 当存在 A -> B 并且 B -> A 的情况时,默认情况下 singleton 类型可以通过提前暴露未完全初始化的对象来解决问题;但对于 prototype 则无法自动解决此类问题,需重新设计结构避免环形引用发生。 --- #### 9. **Spring 中单例 Bean 是否线程安全?** 单例 Bean 本身并不具备天然的线程安全性,这取决于具体实现类内部状态是否会发生改变。如果某个方法修改了成员变量,则可能导致线程环境下数据不一致现象出现。 --- #### 10. **Spring 如何处理线程并发问题?** 通常采用以下几种策略应对高并发需求下的服务调用: - 同步锁 (`synchronized`)- 数据库层面加锁机制 (乐观锁 / 悲观锁)- Redis 分布式锁方案; - 不变模式——确保任何时刻访问到的数据始终处于只读状态[^2]。 --- #### 11. **Spring 中 Bean 的生命周期** 典型的 Bean 生命周期流程如下所示: 1. 实例化阶段 – 创建目标对象实例。 2. 属性赋值阶段 – 设置 XML 文件定义好的参数值给对应字段。 3. Aware 接口回调执行期 —— 如果实现了特定接口比如 BeanNameAware ,则在此处触发相应动作。 4. 初始化完成前钩子函数运行时期 —— 可选步骤,允许自定义预处理逻辑。 5. 正常运作期内持续存活直到销毁为止。 6. 销毁之前清理工作开展完毕之后结束整个生命历程。 --- #### 12. **Spring Bean 的扩展点** 可通过多种途径定制化行为表现形式,包括但不限于以下几个方向: - FactoryBean 接口重写 getObject() 返回特殊类型的实体而非原始 POJO 形态。 - InitializingBean & DisposableBean 接口分别代表启动后首次可用瞬间以及终止前所做最后一件事的机会窗口。 - @PostConstruct/@PreDestroy 注解标记的方法会在合适的时间节点被调用。 --- #### 13. **在 Spring 中如何注入一个 Java 集合?** 利用 `<util:list>`、`<util:set>` 等标签可以直接声明标准集合类型,并将其作为普通属性一样绑定至指定位置上。另外也可以借助泛型提示信息配合反射机制动态生成匹配结果集。 ```xml <util:list id="exampleList" value-type="java.lang.String"> <value>Item One</value> <value>Item Two</value> </util:list> ``` --- #### 14. **Bean 的自动装配** 基于类型(`byType`)或名称(`byName`)两种方式进行匹配关联外部资源文件路径名与本地变量之间建立映射关系。现代版本推荐优先考虑注解风格(@ComponentScan,@Qualifier)[^3]。 --- #### 15. **Spring 用到了哪些设计模式?** 列举几个典型例子说明: - 单例模式(Singleton Pattern): 所有的无状态 bean 默认均遵循此原则。 - 工厂模式(Factory Pattern): Application Context/BeanFactory充当生产者的角色。 - 观察者模式(Observer Pattern): Event Listener System体现该理念的实际运用案例之一。 --- 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值