为什么不在spring容器管理controller

本文探讨了Spring容器与SpringMVC容器的关系及其管理方式。详细解释了两者为何采用父子容器模式,以及如何合理配置以支持服务扩展。
Spring容器与SpringMVC容器

1.疑问:为什么不用spring去管理所有类?

我们配置springMVC 中,为什么controller不直接交给spring 管理而要spring MVC容器单独分开来管理

2.Spring容器 与 SpringMVC关系

Spring容器与SpringMVC容器是父子关系,子容器可以访问父容器的对象,父容器不能访问子容器的类,如果我们在springMVC配置
文件中,直接扫描所有类,把service、dao、controller都交给SpringMVC去管理是可以的,但是假如用spring去管理
Contoller,它是访问不到这个类的,因为contoller是在springMVC容器中,假如在Spring配置直接扫描所有类包括
controller,而不配置springMVC的话,这样服务器发来的请求,将会出现404的问题,因为它找不到controller,spring
无法注入Controller

[plain] view plain copy
例如:
在applicationContext-service中配置:
<!-- 扫描包加载Service实现类 -->
<context:component-scan base-package="com.easybuy"></context:component-scan>
会扫描@Controller、@Service、@Repository、@Compnent

Springmvc.Xml中不扫描。
结论:springmvc。不能提供服务,因为springmvc子容器中没有controller对象。

3.为什么不直接在SpringMVC.xml中扫描所有类?

原则上我们是可以把service、dao
和controller都交给springMVC去管理,直接在SpringMVC配置文件中让它扫所有包就可以,但是出于未来扩展的考虑,spring
和springMVC分开配置,由 spring 去管理service,有利于以后扩展,即便以后加多个struct2也不用影响原有配置

------------------------------------------------------------------------------------------------------------------------------------

一、Spring容器和springmvc容器的关系如下图所示:

Springspringmvc和作为两个独立的容器,会把扫描到的注解对象分别放到两个不同的容器中,

Springmvc容器是spring容器的一部分,他们访问对象的范围如下所示:

①:springmvc子容器可以访问spring父容器中的对象

②:spring父容器不能访问springmvc子容器中的对象

 

***在实际应用中的实例***

一般情况下,一个spring / springmvc / mybatis 组合的框架中,会存在以下几个配置文件:

 

  1. applicationContext-service.xml 文件

        <!-- 配置service层的组件扫描器 -->

        <context:component-scan base-package="com.prozhu.service"></context:component-scan>

    说明:在这个里面存在着一个spring的注解扫描器。用来扫描@Service的注解

     

  2. Springmvc.xml 文件

    <!-- 配置Controller扫描器 -->

    <context:component-scan base-package="com.prozhu.controller" />

    说明:这个里面存在着springmvc的注解扫描器,专门用来扫描@Controller的注解

     

    然后呢?有点同学可能会想,我能不能合并成一个注解扫描器,来完成对象注入的问题?将配置文件中的注解扫描器更改为如下配置:

     

    applicationContext-service.xml文件中进行全局扫描的配置:

    而在springmvc中不配置注解扫描器

    <!-- 配置spring的注解扫描器 -->

    <context:component-scan base-package="com.prozhu" />

     

    说明:用这个扫描器分别扫描service层和controller层的注解:@Service /@Controller / @Autowired

    当一旦采用这种方式之后,spring会将扫描的对象都会存放到spring的容器,而不会放到springmvc子容器中,当访问项目的时候,

    springmvc找不到处理器映射器,和其对应的Controller,进而报404错误!

     

  3. 不用spring容器,只用springmvc容器行不行呢?

    答案:是可以的,在这个里面可以同时扫描Controller层、service层、dao层的注解。

     

  4. 在springmvc 和 spring 都有注解扫描的前提下,能不能将事务配置在Controller层?

    答案:是不能的,因为事务管理器是配置在spring容器中的,如果将事务配置在Controller层的话,spring容器就访问不了springmvc子容器,

    进而无法访问到事务对象。进而导致事务失效。

以上部分内容转自:https://www.cnblogs.com/Prozhu/p/6709320.html
### 如何将Controller组件注册到Spring容器中 在Spring框架中,`@Controller` 注解用于标记一个类作为控制器组件。当这个注解被应用时,Spring会自动扫描并将其注册为Spring容器中的一个Bean。以下是实现这一过程的关键机制及其细节: #### 自动扫描与组件注册 为了使带有 `@Controller` 的类能够被Spring容器识别并注册,需要启用组件扫描功能。这通常通过在配置类上使用 `@ComponentScan` 或者在XML配置文件中定义 `<context:component-scan>` 来完成。 例如,在基于Java配置的方式下: ```java @Configuration @ComponentScan(basePackages = "com.example.controller") // 扫描指定包下的@Controller类 public class AppConfig { } ``` 上述代码片段表明,Spring会在 `com.example.controller` 包及其子包中查找所有标注了 `@Component` 及其衍生注解(如 `@Controller`, `@Service` 等)的类,并将它们注册为Spring容器中的Beans[^4]。 如果采用的是Spring Boot,则无需显式声明 `@ComponentScan`,因为默认情况下,Spring Boot会根据主应用程序类的位置自动推断基础包路径进行扫描。例如: ```java @SpringBootApplication // 启用了 @EnableAutoConfiguration 和 @ComponentScan public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` 这里,`@SpringBootApplication` 实际上是一个复合注解,它包含了 `@ComponentScan` 功能,因此可以自动发现并注册所有的 `@Controller` 类型组件[^2]。 #### DispatcherServlet的作用 一旦控制器被成功注册至Spring容器,接下来的工作便是由前端控制器 `DispatcherServlet` 将HTTP请求映射到相应的处理方法。`DispatcherServlet` 是整个Web流程的核心入口点,负责接收客户端请求并将这些请求分发给合适的处理器[^3]。 综上所述,要让一个 `@Controller` 组件生效,需确保以下几点: 1. 使用适当方式开启组件扫描; 2. 正确设置基础包路径以便覆盖目标控制器所在位置; 3. 配置好 `DispatcherServlet` 并部署于运行环境中以支持MVC架构运作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值