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

spring java配置

大家好,我很久没有写新文章了。 积累了很多资料,需要在不久的将来在我的博客中发布。 但是现在我想谈谈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配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android封装oauth2,Android AccountAuthenticator和OAuth2

这肯定是可行的。来自Android AccountManager文档&#xff1a;Many servers support some notion of an authentication token, which canbe used to authenticate a request to the server without sending theusers actual password. (Auth tokens are normally created with…

php redis 队列抢红包_php+redis实现消息队列

消息队列&#xff1a;是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递&#xff1b;如果发送消息时接收者不可用&#xff0c;消息队列会保留消息&#xff0c;直到可以成功地传递它应…

使用Spring Security在Spring Boot中进行缓存

在这篇文章中&#xff0c;我想分享一下O&#xff06;B的一个团队的经验教训。 他们正在使用带有Spring Security的Spring Boot。 默认情况下&#xff0c;Spring Security保护的所有内容都将通过以下HTTP标头发送到浏览器&#xff1a; Cache-Control: no-cache, no-store, max…

wifi定位算法android,WIFI定位算法

网络定位指通过周边wifi列表、基站列表、IP地址等信息确定用户位置的过程。 我们采集的训练数据是每个GPS坐标位置和对应的Wifi和基站列表。 其中每个Wifi和基站有唯一的Mac地址作为ID和信号强度。有三种定位方法&#xff1a;均值法首先估计一个wifi的中心点位置&#xff0c;可…

仿小黄车android定位,小黄车ofo是怎么实现自行车定位功能的?

摩拜单车通过车身携带的GPS而实现单车定位&#xff0c;但是我们知道ofo是没有安装GPS&#xff0c;它又是如何实现单车定位的呢&#xff1f;我居住的地方距离地铁站步行大约15分钟左右&#xff0c;距离最近的商场步行将近30分钟&#xff0c;距离周边的便利店,水果店,饭店等步行1…

python苹果下载软件助手哪个好_Mac上有什么实用的必备软件?

Mac上的一些软件真的超好用&#xff0c;比如...每天依据时间变化的壁纸&#xff0c;看清晨、看夕阳我是 Super叔 ,关注了就是好朋友,这里说明下还是,软件只是工具,初衷是为了方便自己提高效率,别为了去模仿所谓某某软件可以怎么怎么复杂的,用得多么炫酷好用,而去花非常多精力为…

hibernate 刷新_Hibernate事实:了解刷新操作顺序很重要

hibernate 刷新Hibernate将开发人员的思维方式从思考SQL转变为思考对象状态转换。 根据Hibernate Docs&#xff0c;实体可能处于以下状态之一&#xff1a; new / transient&#xff1a;实体不与持久性上下文相关联&#xff0c;因为它是数据库不知道的新创建的对象。 持久性&a…

android变量要不要附空值,android-如何在使用Parcelable时序列化空值

我见过的大多数序列化代码都使用两个标志来指示值的存在/不存在&#xff0c;或者在值前加上一个计数字段(例如&#xff0c;在编写数组时)&#xff0c;如果该值不等于&#xff0c;则计数字段仅设置为零。 根本不存在。检查Android核心类的源代码会发现以下代码(来自Message类)&a…

gprs连接中断记录_请收好!脉搏波血压计连接天天血压APP使用指南

总有那么几个粗心的小伙伴丢失了说明书&#xff0c;在后台追问波哥如何连接“天天血压”&#xff0c;于是给大家安排了这篇使用指南。首先我们来了解下“天天血压”的功能&#xff1a;1.通过蓝牙或GPRS传输&#xff0c;同步记录每次测量结果&#xff1b;2. 血压趋势分析&#x…

使用Spring Boot,JHipster和React构建照片库PWA

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 从本质上讲&#xff0c;React只是一个UI工具包&#xff0c;即ala GWT&#xff0c;但是…

html5画布funcition,2020前端基础知识学习第一节(示例代码)

一、选择题1. 浏览器端的存储技术有哪些()A.cookie  B.localStorage  C.session  D.userData答案&#xff1a;A B D分析&#xff1a;cookie通常用于存储用户等登录信息&#xff0c;能够存储的数据是有限的&#xff0c;而且在指定域名下所有的请求都会带上。localStoage是…

names文件和data文件_data.table让你的读取速度提升百倍

不知道大家有没有用read.table和read.csv读取过文件&#xff0c;当文件不大的时候你可能还感觉不出读取速度&#xff0c;但是当文件比较大的时候&#xff0c;比如有上万行的时候&#xff0c;你就会感觉到等待时间明显变长&#xff0c;甚至无法忍受。今天小编给大家安利一个实用…

差分放大电路差模共模公式_提高差分放大器的共模抑制比,电阻的选择很关键...

在各种应用领域&#xff0c;采用模拟技术时都需要使用差分放大器电路。例如测量技术&#xff0c;根据其应用的不同&#xff0c;可能需要极高的测量精度。为了达到这一精度&#xff0c;尽可能减少典型误差源(例如失调和增益误差&#xff0c;以及噪声、容差和漂移)至关重要。为此…

计算机网络的含义是什么意思,互联网的基本含义是什么

互联网大家都知道&#xff0c;但是互联网的基本含义都了解吗?学习啦小编为大家整理了相关内容&#xff0c;供大家参考阅读!互联网的基本含义互联网是由一些使用公用语言互相通信的计算机连接而成的网络&#xff0c;即广域网、局域网及单机按照一定的通讯协议组成的国际计算机网…

在单个try-with-resources语句中仔细指定多个资源

Java 7更有用的新功能之一是引入了try-with-resources语句 [AKA 自动资源管理 &#xff08; ARM &#xff09;]。 try-with-resources语句的吸引力在于其承诺 “确保在语句末尾关闭每个资源”。 在这种情况下&#xff0c;“资源”是实现AutoCloseable及其close&#xff08;&…

两轮差速机器人舵机转轴示意图_机器人教程2:舵机及转向控制原理

图3舵机外形图2、舵机的组成一般来讲&#xff0c;舵机主要由以下几个部分组成&#xff0c;舵盘、减速齿轮组、位置反馈电位计、直流电机、控制电路等&#xff0c;如图4、图5所示。图4舵机的组成示意图图5舵机组成舵机的输入线共有三条&#xff0c;如图6所示&#xff0c;红色中间…

label标签 html5,HTML5 label 标签

实例HTML5 标签用于为 input 元素做出标记。带有两个输入字段和相关标记的简单 HTML 表单&#xff1a;MaleFemale尝试一下 浏览器支持目前大多数浏览器支持 标签。标签定义及使用说明标签为 input 元素定义标注(标记)。label 元素不会向用户呈现任何特殊效果。不过&#xff0c;…

me shy是什么歌 抖音make_抖音星河滚烫你是人间的理想下一句是什么歌 星河歌词完整版...

最近在抖音上听到一段话&#xff0c;这段话的开头是“星河滚烫&#xff0c;你是人间的理想……”。抖音星河滚烫你是人间的理想下一句是什么歌&#xff1f;星河歌词介绍&#xff1f;星河&#xff0c;是非常好听的一首歌曲&#xff0c;是很多人都喜欢的一首歌曲。抖音星河滚烫你…

修改使用计算机的名称,Windows 10中修改计算机名称的方法,你知道几种?

当用户新入手一台电脑时&#xff0c;通常做的第一件事就是做一些个性化设置。一般来说个性化的第一步就是给计算机起一个自己满意的名字&#xff0c;下面介绍几种修改计算机名字的方法。通过设置更改计算机名字按WinI键进入设置,在设置窗口中找到“系统”&#xff0c;点击它。在…

apollo 参数传递_使用Apollo通过WebSocket通过STOMP轻松进行消息传递

apollo 参数传递在我以前的文章中&#xff0c;我介绍了几个有趣的用例&#xff0c;这些用例使用著名的消息代理HornetQ和ActiveMQ通过Websockects实现STOMP消息传递。 但是我没有介绍的是Apollo&#xff0c;因为我个人认为它的API是冗长的&#xff0c;并且不像Java开发人员那样…