使用Java配置搭建SSH框架

时代在不断进步,大量基于xml的配置所带来的弊端也显而易见,在XML配置和直接注解式配置之外还有一种有趣的选择方式-JavaConfig,它是在Spring 3.0开始从一个独立的项目并入到Spring中的。它结合了XML的解耦和JAVA编译时检查的优点。JavaConfig可以看成一个XML文件,只不过是使用Java编写的。现在下面为大家展示如何编写基于java Config 配置 spring+springmvc+hibernate。

项目是在intellj IDE 下创建的maven项目,目录如下

使用Java配置搭建SSH框架

按照传统的方式,像DispatchServlet这样的Servlet会配置在web.xml文件中,但是借助Servlet3规范和Spring3.1增强,我们可以使用java将DispatchServlet配置在Servlet容器中,下面展示初始化类文件

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    //指定配置类
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }

@Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }
   
    //将DispatchServlet映射到“/”
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}

创建WebInitializer需要继承AbstractAnnotationConfigDispatcherServletInitializer,因为继承该类的任意类都会自动地配置DispatchServlet和Spring应用上下文,Spring的应用上下文会位于应用程序的Servlet上下文之中。

使用Java配置搭建SSH框架

  

我们可以看到底层的AbstractAnnotationConfigDispatcherServletInitializer拓展和实现了WebApplicationInitializer,在Servlet3 环境中,容器会在类路径中查找实现了javax.servlet.ServletContainerInitializer接口的类,并将该类来配置Servlet容器,而spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现了WebApplicationInitializer的类并将配置的任务交给他们来完成,所以当我们WebInitializer拓展了AbstractAnnotationConfigDispatcherServletInitializer ,同时就实现了WebApplicationInitializer,因此当部署到Servlet3.0容器中的时候,容器就会自动发现他,并用它来配置Servlet上下文。

WebInitializer中要求DispatchServlet加载应用上下文时,使用定义在WebConfig配置类中的bean。

在使用xml配置spring的时候,必须配置spring监听器,也是就ContextLoaderListener,然而很多人不知道的是,ContextLoaderListener会创建spring web 应用中的另一个上下文。

我们希望DispatchServlet加载包含Web组件的bean,如控制器、视图解析器以及处理器映射,而ContextLoaderListener要加载应用中的其他bean,这些bean通常是驱动应用后端的中间层和数据层组件。

也就是说WebConfig的类中会用来定义DispatcherServlet应用上下文的bean,RootConfig的类中会用来配置ContextLoadListener创建的上下文的bean

@Configuration
@EnableWebMvc //注解驱动springMVC 相当于xml中的<mvc:annotation-driven>
@ComponentScan("scau.zzf.web")//启用组件扫描
public class WebConfig extends WebMvcConfigurerAdapter {
    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver=
                new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }
    //配置静态资源的处理,要求DispatchServlet对静态资源的请求转发到servlet容器中默认的Servlet上
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

}

@Configuration
@Import(HibernateConfig.class)//导入Hibernate配置文件
@ComponentScan(basePackages={"scau.zzf"},
        excludeFilters={
                @ComponentScan.Filter(type= FilterType.CUSTOM, value=RootConfig.WebPackage.class)
        }
)
public class RootConfig {
    //扫描除了web以外的所有包
    public static class WebPackage extends RegexPatternTypeFilter {
        public WebPackage() {
            super(Pattern.compile("scau.zzf\\.web"));
        }
    }

}

HbernateConfig 如下

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/76d03724caf72818ee5622d63367c363.html