4 个回答

struts2 没有用过,我就谈谈 SpringMVC 的控制吧,SpringMVC 的控制器,我可以理解成DispatcherServlet, 这个类在传统的Spring项目中会在web.xml中进行配置,以下皆以传统Spring项目为例(SpringBoot同理),配置完之后,Servlet容器(tomcat举例)会为DispatcherServlet实例并且初始化,如果load-start-up配置为>= 1 那么,tomcat会主动发起一次http请求,此时dispathcerServlet已经可以投入使用了。

如果你配置了Springmvc.xml文件,并且在内部有mvc:resource的配置,很好,Spring会去加载,加载的东西,参考MvcNameSpaceHandler , 于是 RequestMappingHandler RequestMappingHandlerAdapterSimplexxx 会被加载到Spring容器中,如果配置了 mvc:default-servlet ,那么会对静态资源进行一次重定向处理,重定向到defaultServlet,如果没有配置,也不要怕,我们还有dispatcherServlet.properteis文件。内置了 handlerMapping HandlerAdapter

接下来回答正题,控制是有的,但是没有也是可以的。

  • 控制体现在,Spring可以通过mvc命名空间去加载一些bean处理资源。
  • 没有也可以的是配置文件本身也有

另外这里涉及Spring父子容器的关系,就不多说了

Servlet路径映射和springmvc路径处理

能被 IOC 管理的都是打了 @Component 及相关注解的,否则 Spring 启动后扫描需要管理的 Bean 时根本就不会理会。

如果你想知道 Spring 有没有处理一些类,那么可以这样:

@Component
public class BeanScanner implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization (Object bean, String beanName) throws BeansException {
        System.out.println(String.format("<<Post>> bean: %s | name: %s", bean.getClass().getName(), beanName));
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization (Object bean, String beanName) throws BeansException {
        return bean;
    }
}

跑一下,去日志里看看 <<Post>> 开头的记录里有没有你想看的那几个类。

谢谢回答。我已找到答案:
ssh2的开发者定义的struts2控制器spring ioc容器不管理其生命周期,因为struts2的action往往不加spring的注解,@Controller注解是针对spring mvc的controller的,不适用于struts2的action。struts2的action加了@Component注解就会被spring容器管理生命周期,当成一个普通的bean,这种注解的添加不常见。ssm会管理一些Handler和Adapter的生命周期,开发者定义的控制器也会被管理,因为spring容器分为应用层spring容器和web层spring容器,属于父子关系,符合依赖倒转原则。

以下是网络文章的举例:
ssm请看这一段:
https://blog.csdn.net/l_black...
Controller即声明这个类是一个控制器,上面第二部分我们说明了,只要加了@Controller标示的,spring会通过自动扫描机制,将这个类纳入spring容器管理中。

ssh2的请看这一段:

     那时我有些不是很明白,为什么我的action类没有写注解@Component("xxAction"),还是可以被spring自动装配。那是因为action类被struts和struts2-spring-plugin创建,再由spring自动装配,但不由spring管理。如果我们想使用spring复杂的aop或spring其他的功能时,强烈建议将acion类注册到spring容器中。

struts在新的项目里不推荐使得

你知道吗?

宣传栏