tomcat启动spring模拟

Servlet3.0 - ServletContainerInitializer注册JAVA组件:
在web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等,servlet规范中通过ServletContainerInitializer实现此功能。每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类,那么,当web容器启动时就会运行这个初始化器做一些组件内的初始化工作。一般伴随着ServletContainerInitializer一起使用的还有HandlesTypes注解,通过HandlesTypes可以将感兴趣的一些类注入到ServletContainerInitializerde的onStartup方法作为参数传入。

tomcat启动过程中StandardContext.startInternal方法会加载METE-INF下面的services的配置文件中配置的类,Tomcat容器的ServletContainerInitializer机制的实现,主要交由Context容器和ContextConfig监听器共同实现。

对于实现了ServletContainerInitializer这个接口的类会解析@HandlesTypes这个注解中的类,写一个类实现WebApplicationInitializer 模拟spring的初始化及访问。

@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {...
    for (WebApplicationInitializer initializer : initializers) {
	initializer.onStartup(servletContext);
...}

public class MyApplication implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>");
        AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
        ac.register(MyConfig.class);
        ac.refresh();

        DispatcherServlet dispatcherServlet = new DispatcherServlet(ac);
        ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcherServlet", dispatcherServlet);
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);
    }
}

@Configuration
@ComponentScan({"xyz.luofu.www"})
public class MyConfig {

    @Bean
    public InternalResourceViewResolver getInternalResourceViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}

@Controller
public class MyController {

    @RequestMapping("/index")
    public String index() {
        System.out.println("mycontroller coming!!!");
        return "index";
    }
}

配置tomcat插件

<build>
        <finalName>demo</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                </plugin>
            </plugins>
    </build>

ideal中配置tomcat EditConfigurations 点击 + 号 Maven,Working directory 中填入工程项目demo Command line 填入tomcat7:run 你也可以按提示填入其他命令,配置好后点击启动。浏览器访问成功

posted @ 2020-04-26 16:04  gsluofu  阅读(274)  评论(0编辑  收藏  举报