作用:使用编码方式在项目启动时给ServletContext里面添加组件

1)ServletContainerInitializer实现

2)ServletContextListener实现

例:ServletContainerInitializer

@HandlesTypes(value = {HelloService.class})
public class MyServletContainerInitializer implements ServletContainerInitializer{

    @Override
    public void onStartup(Set<Class<?>> set, ServletContext ctx)
            throws ServletException {
        System.out.println("感兴趣的类型:");
        for(Class<?> clazz: set) {
            System.out.println(clazz);
        }
        ctx.addListener(HelloListener.class);
        ServletRegistration.Dynamic servlet = ctx.addServlet("helloServlet", HelloServlet.class);
        servlet.addMapping("/hello");
        
        FilterRegistration.Dynamic filter = ctx.addFilter("helloFilter", HelloFilter.class);
        filter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
    }

}
public class HelloFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("HelloFilter....");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }

}
public class HelloListener implements ServletContextListener{

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("contextInitialized.....");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("contextDestroyed......");
    }

}