生活随笔
收集整理的這篇文章主要介紹了
spring java配置_Spring:使基于Java的配置更加优雅
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
spring java配置
大家好,我很久沒有寫新文章了。 積累了很多資料,需要在不久的將來在我的博客中發布。 但是現在我想談談Spring MVC應用程序配置。 確切地說,我想談談基于Java的Spring配置。
盡管在3.0版本中引入了基于Spring java的配置,但是許多開發人員仍然使用基于XML的方法。 我個人使用基于注釋的配置,因為它們在管理,開發和維護方面更加方便。 如果您已經閱讀過我的博客,那么您可能會注意到在所有代碼示例中,我都完全使用基于Java的配置。
不久前,我對我的項目進行了代碼審查。 我注意到配置的結構出了點問題。 對我來說,有兩個方面很糟糕:
- 所有bean都配置在一個類中
- Web應用程序上下文的初始化太復雜
您可以在我所有的Spring MVC應用程序示例中看到這兩個缺點。 例如,您可以打開我關于CNVR的Spring REST服務的最新教程之一 。 看一下兩個類: WebAppConfig和Initializer 。
WebAppConfig
第一個代表本文的第一點。 絕對我需要做一些事情來邏輯上拆分bean配置。 為了解決此問題,我決定執行兩個步驟:
將數據庫配置移到單獨的類中 @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;}} 在主配置類中轉換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配置
總結
以上是生活随笔為你收集整理的spring java配置_Spring:使基于Java的配置更加优雅的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。