大家好,我很久没有写新文章了。 积累了很多资料,需要在不久的将来在我的博客中发布。 但是现在我想谈谈Spring MVC应用程序配置。 确切地说,我想谈谈基于Java的Spring配置。

尽管在3.0版本中引入了基于Spring Java的配置,但是许多开发人员仍然使用基于XML的方法。 我个人使用基于注释的配置,因为它们在管理,开发和维护方面更加方便。 如果您已经阅读过我的博客,那么您可能会注意到在所有代码示例中,我都完全使用基于Java的配置。

不久前,我对我的项目进行了代码审查。 我注意到配置结构有问题。 对我来说,有两个方面很糟糕:

  • 所有bean都配置在一个类中
  • 在Web应用程序上下文中初始化太复杂

您可以在我所有的Spring MVC应用程序示例中看到这两个缺点。 例如,您可以打开我关于CNVR的Spring REST服务的最新教程之一 。 看一下两个类: WebAppConfigInitializer

WebAppConfig

第一个代表本文的第一点。 绝对我需要做一些事情来逻辑上拆分bean配置。 为了解决此问题,我决定执行两个步骤:

  1. 将数据库配置移到单独的类中

    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories("com.mobapp.repository")
    public class DataBaseConfig {private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";private static final String PROPERTY_NAME_DATABASE_URL = "db.url";private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";@Resourceprivate Environment env;@Beanpublic DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));return dataSource;}@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactory() {LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();entityManagerFactoryBean.setDataSource(dataSource());entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class);entityManagerFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));entityManagerFactoryBean.setJpaProperties(hibProperties());return entityManagerFactoryBean;}private Properties hibProperties() {Properties properties = new Properties();properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));return properties;        }@Beanpublic JpaTransactionManager transactionManager() {JpaTransactionManager transactionManager = new JpaTransactionManager();transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());return transactionManager;}}
  2. 在主配置类中转换WebAppConfig类,并通过@Import批注将其余的配置类(在当前情况下仅为DataBaseConfig类)分配给它。
    @Configuration
    @EnableWebMvc
    @Import({DataBaseConfig.class})
    @ComponentScan("com.mobapp")
    @PropertySource("classpath:application.properties")
    public class WebAppConfig extends WebMvcConfigurerAdapter {@Resourceprivate Environment env;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");}@Overridepublic void configureContentNegotiation(ContentNegotiationConfigurer configurer) {configurer.favorPathExtension(true).useJaf(false).ignoreAcceptHeader(true).mediaType("html", MediaType.TEXT_HTML).mediaType("json", MediaType.APPLICATION_JSON).defaultContentType(MediaType.TEXT_HTML);}@Beanpublic ViewResolver contentNegotiatingViewResolver(ContentNegotiationManager manager) {List< ViewResolver > resolvers = new ArrayList< ViewResolver >();InternalResourceViewResolver r1 = new InternalResourceViewResolver();r1.setPrefix("/WEB-INF/pages/");r1.setSuffix(".jsp");r1.setViewClass(JstlView.class);resolvers.add(r1);JsonViewResolver r2 = new JsonViewResolver();resolvers.add(r2);ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();resolver.setViewResolvers(resolvers);resolver.setContentNegotiationManager(manager);return resolver;}/*** View resolver for returning JSON in a view-based system. Always returns a* {@link MappingJacksonJsonView}.*/public class JsonViewResolver implements ViewResolver {public View resolveViewName(String viewName, Locale locale)throws Exception {MappingJacksonJsonView view = new MappingJacksonJsonView();view.setPrettyPrint(true);return view;}}}

    这样,您可以将单个大型配置类分为几个较小的类,这些类将包含针对它们的特定配置。

初始化器

在上面提到的示例中, Initializer类的代码过于冗长,并提供了指向其的链接。 我在那里注册了Web应用程序的根配置,映射和过滤器。 如何减少代码行数? 我在AbstractAnnotationConfigDispatcherServletInitializer类上找到了答案。 查看该类,您会注意到它实现了WebApplicationInitializer接口,我在上一版本的Initializer类中已实现了该接口。 所以这是Initializer的新版本:

public class Initializer extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class< ? >[] getRootConfigClasses() {return null;}@Overrideprotected Class< ? >[] getServletConfigClasses() {return new Class< ? >[] { WebAppConfig.class };}@Overrideprotected String[] getServletMappings() {return new String[] { "/" };}@Overrideprotected Filter[] getServletFilters() {return new Filter[] { new HiddenHttpMethodFilter() };}}

由于这两个步骤,我使Spring MVC应用程序的配置更加优雅。 现在您也可以这样做。 祝好运

参考: Spring:在Fruzenshtein的Notes博客上,与我们的JCG合作伙伴 Alexey Zvolinskiy一起使基于Java的配置更加优雅 。

翻译自: https://www.javacodegeeks.com/2013/11/spring-make-your-java-based-configuration-more-elegant.html

Spring:使基于Java的配置更加优雅相关推荐

  1. spring java配置_Spring:使基于Java的配置更加优雅

    spring java配置 大家好,我很久没有写新文章了. 积累了很多资料,需要在不久的将来在我的博客中发布. 但是现在我想谈谈Spring MVC应用程序配置. 确切地说,我想谈谈基于Java的Sp ...

  2. spring中基于Java容器配置注解的区别及使用场景

    转载自百家号作者:有趣的代码 @Component.@Service.@Controller.@Repository:@Configuration.@Bean区别,使用场景 从spring3.0开始, ...

  3. Spring中基于Java的配置@Configuration和@Bean用法

    spring中为了减少xml中配置,可以生命一个配置类(例如SpringConfig)来对bean进行配置. 一.首先,需要xml中进行少量的配置来启动Java配置: [java] view plai ...

  4. spring java配置_Spring基于java的配置

    我们之前都了解过spring基于xml的配置,我们也可以通过配置类来完成基于xml的配置,我们会在下面以一个例子来讲述一下Spring基于java的配置. 首先第一步准备工作: 1)创建一个Dog类 ...

  5. spring 加载java类_在Spring中基于Java类进行配置的完整步骤

    在Spring中基于Java类进行配置的完整步骤 发布于 2020-7-7| 复制链接 基于Java配置选项,可以编写大多数的Spring不用配置XML,下面 前言JavaConfig 原来是 Spr ...

  6. Spring MVC:使用基于Java的配置创建一个简单的Controller

    这是我博客上与Spring MVC相关的第一篇文章. 开端总是令人兴奋的,因此我将尽量简洁明了. Spring MVC允许以最方便,直接和快速的方式创建Web应用程序. 开始使用这项技术意味着需要Sp ...

  7. 使用Spring 3.1和基于Java的配置构建RESTful Web服务,第2部分

    1.概述 本文介绍了如何在Spring中设置REST –控制器和HTTP响应代码,有效负载编组配置和内容协商. 2.在Spring了解REST Spring框架支持两种创建RESTful服务的方式: ...

  8. Spring IoC — 基于注解的配置

    基于XML的配置,Bean定义信息和Bean实现类本身是分离的,而采用基于注解的配置方式时,Bean定义信息即通过在Bean实现类上标注注解实现. @Component:对类进行标注,Spring容器 ...

  9. spring 基于java的配置

    2019独角兽企业重金招聘Python工程师标准>>> 7.10 Classpath scanning and managed componets 文档地址: http://docs ...

最新文章

  1. 调试寄存器 原理与使用:DR0-DR7
  2. Win2003的DHCP服务器无法提供服务怎么办?
  3. php实现小论坛,PHP开发 小型论坛教程之添加论坛-1
  4. UML图大科普 :14种UML图图例详解
  5. KDE/QT vs GNOME/GTK
  6. [内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析
  7. Vmware 连接局域网通过桥接方式
  8. 算法笔记之——快速幂
  9. Linux保护文件实现,Linux完整性保护机制模块实现分析(1)
  10. 10深入Redis Cluster2
  11. Bsdiff差分算法讲解
  12. request.get_full_path() 和request.path区别
  13. 蓝牙耳机性能测试软件,操作方便吗 蓝牙耳机横评之功能测试篇
  14. Hbase 详细介绍以及简单的Hbase命令操作(入门必备)
  15. 如何破解校园网wifi?怎样破解校园网不能共享wifi?校园网路由器如何破解?
  16. [从零开始学习FPGA编程-58]:集成电路设计的运作模式(Fabless/Foundry/IDM模式)
  17. Unity中下载图片、音频和视频
  18. bi产品有哪些,商业智能产品
  19. 编程累了,欣赏一下小马的创业语录。
  20. Kotlin学习笔记(八)by的作用,属性委托和类的委托,和Lazy的关系

热门文章

  1. spingmvc 通过xml配置redis jedispol 有密码 通过xml配置redis中的 jedispool(有密码)
  2. 圆心角 圆弧上点坐标_数控加工中心CNC的G02/G03圆弧指令的I、J、与R的区别
  3. idea2021部署maven+javaweb项目到jboss(diy)
  4. rabbitmq手动确认ack
  5. Java BigDecimal和double区别
  6. telnet实现本地回显
  7. 重新学习Spring2——IOC和AOP原理彻底搞懂
  8. java每个阶段的学习时间_每个Java学习者都会犯的10个最常见的1个错误
  9. sun jdk 与jdk_Sun过去的世界中的JDK 11和代理
  10. mysql重置增量_摆脱困境:在每种测试方法之前重置自动增量列