分类: Spring

  • Spring Boot获取Active Profile的值

    Spring Boot提供了profile机制,可以快速的在不同情况下切换配置。

    默认支持很多配置,从Spring整体的行为到具体的数据库,渲染引擎的行为都有支持。按照文档给出的配置名称和可选值操作就可以了。

    有些时候我们需要基于profile来实现自己的一些配置,这个时候就需要自己完成一些后面的细节了。

    举个比较常见的例子,profile分为了dev和prod两种。而项目本身需要支持上传图片功能,需要在profile中指定文件配置,比如

    upload.path=C:Users315junAppDataLocalTemp

    要获取这个值,我们有三种办法

    • 从Env中读取
    @Autowired
    private Environment env;
    String path=env.getProperty("upload.path");
    • 构造一个Config类,通过注解自动注入
    @ConfigurationProperties(prefix ="upload")
    publicclass UpdatePathConfig {
    private String path;
    
    public StringgetPath() {
    return path;
    }
    
    publicvoidsetPath(String path) {
    this.path = path;
    }
    }
    • 通过Value注解注入
      这种方法最直接,在对应的字段上标注即可。
    @Value("${upload.path}")
    
  • Spring Boot 中文乱码问题

    Spring Boot默认的编码并不是UTF8,在一些表单中中文会有乱码的情况,需要添加一个Filter来解决。

    Spring Boot大量使用注解,而不是xml配置文件,所以我们的Filter也使用Java-base的配置模式。

    @Beanpublic FiltercharacterEncodingFilter() {
      CharacterEncodingFilter characterEncodingFilter =new CharacterEncodingFilter();
      characterEncodingFilter.setEncoding("UTF-8");
      characterEncodingFilter.setForceEncoding(true);
      return characterEncodingFilter;
    }

    相关文章:

    再谈Spring Boot中的乱码和编码问题

    网站乱码和ISO-8859-1与UTF-8

     …

  • 使用JsonNodeFactory快速构建Json响应

    在Spring中可以使用@ResponseBody来让返回对象直接转化为Json格式,这种方式需要提供一个专门的对象来作为内容的承载。

    如果只是需要快速的一段简单的Json响应就没有必要构造一个对象,然后让对象来承载内容了,可以直接使用JsonNodeFactory来构造。

    JsonNodeFactory是jackson中的类,我使用的是Spring Boot,自动包含了这个依赖库。

    使用时通过JsonNodeFactory.instance来获取工厂对象,然后进行创建。

    @RequestMapping(value ="/status")
    @ResponseBody
    public ObjectNodeshowSuccessStatus() {
    JsonNodeFactory factory = JsonNodeFactory.instance;
    ObjectNode objectNode = factory.objectNode();
    objectNode.set("status", factory.textNode("success"));
    return objectNode;
    }

    `…

  • 快速更改Spring Boot的Active Profile设定

    Spring Boot支持Active Profile,可以方便在不同的环境中快速切换配置,但是这个配置本身的修改却不够简洁。

    如果有两个profile,分别为dev和prod,那么在application.properties文件中

    spring.profiles.active=dev

    就指定了dev为当前配置。

    因为使用了gradle构建工具,所以希望通过类似./gradlew dev bootRun的方式直接切换。

    虽然Spring Boot本身支持运行时带参数,但是每次使用又有些繁琐,稍微修改一下build.gradle文件如下:

    task dev << {
    changeActiveProfile("dev")
    }
    task prod << {
    changeActiveProfile("prod")
    }
    def changeActiveProfile(profile) {
    def pFile = file("src/main/resources/application.properties")
    Properties p = new Properties()
    pFile.withInputStream 
  • 在Spring Boot启动后执行指定代码

    在开发时有时候需要在整个应用开始运行时执行一些特定代码,比如初始化环境,准备测试数据等等。

    在Spring中可以通过ApplicationListener来实现相关的功能,不过在配合Spring Boot使用时就稍微有些区别了。

    创建ApplicationListener

    这里以填充部分测试数据为例子,首先实现ApplicationStartup类。

    publicclass ApplicationStartup implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    publicvoidonApplicationEvent(ContextRefreshedEvent event) {
    SourceRepository sourceRepository = event.getApplicationContext().getBean(SourceRepository.class);
    Source je =new Source("justice_eternal吧","http://tieba.baidu.com/f?kw=justice_eternal");
    sourceRepository.save(je);
    }
    }

    这类并不会自动执行,需要我们注册。

    硬编码注册

    Spring Boot有一个类SpringApplication,这个类是Spring Boot的入口,包含所有的配置。

    @Configuration
    @ComponentScan
    @EnableAutoConfiguration
    publicclass WebApplication {
    
  • Grails生成war包过大的问题

    最近在用Grails,确实体验了一把快速开发的乐趣。

    Grails从名字上看就有点Rails的感觉,使用的很多细节也是。

    快速创建项目,完整的测试框架,完善的插件体系,大部分东西都能够快速实现。

    完成开发以后生成war包,部署到容器上就行了。

    因为要把项目放到生产环境了,看了一下war包的大小,居然有40M+。

    为什么包这么大

    一个war包如此之大,确实惊悚了。因为项目本身并没有太多东西,实在不应该这么大。

    直接拆开war包,主要的集中在assets目录和WEB-INF目录。

    前者是资源目录,包括css,js和png等等。后者主要包含了lib。

    前者的问题好解决,因为用了bower,所以下载的目录中有很多不是必须的东西。

    而后者问题就比较麻烦了。Grails很方便了,集成了很多东西,比如GORM作为数据持久层上依赖了Hibernate,光lib的大小就是5M。

    而且还有一些包明显不应该打在包里面,比如tomcat-embed.jar。

    加快发布

    自己机器上开发当然没有问题,大就大呗,但是这么大一个war包放在服务器上就有点吓人了。

    首先是发布上的问题,这么大的一个包,远程部署过去实在耽误时间。

    对于第一个asserts目录,直接在打包时exclude不需要的东西就是了,也节约不了多少东西。

    对于第二个WEB-INF目录,可以操作的地方就多了。首先移除不需要的东西,可以节约10M左右。这样打包下来还是有30M左右。

    首先在Config.groovy中配置

    defdeps = [
    "hibernate3.jar",
    "groovy-all-*.jar",
    "standard-${servletVersion}.jar",
    "jstl-${servletVersion}.jar",
    "oscache-*.jar",
    "commons-logging-*.jar",
    "sitemesh-*.jar",
    "spring-*.jar",
    "log4j-*.jar",
    "ognl-*.jar",
    "commons-*.jar",
    "xstream-1.2.1.jar",
    "xpp3_min-1.1.3.4.O.jar" ]
    grails.war.dependencies = {
    
  • Spring Mvc的参数注入分析

    Spring Mvc的一个强大之处在于对于各种参数注入的支持。

    除了基本的request,session等等以外,还支持RequestParam等等便利的东西。基本而言使用Spring mvc你可以直接在方法中指明你希望获得的参数,让Spring注入即可。

    参数注入的原理

    Spring Mvc中有一个HandlerMethodArgumentResolver接口,其中包含两个方法:

    publicbooleansupportsParameter(MethodParameter parameter)
    publicObject (MethodParameter parameter,ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory)throws Exception

    当请求被Spring Mvc处理并获取到对应的执行方法时,它会首先检查所需的所有参数,然后依次检查现有的HandlerMethodArgumentResolver等否支持此类型,如果可以再调用resolveArgument方法获取参数对象。

    Spring Mvc自身有RequestParamMethodArgumentResolver,RequestParamMapMethodArgumentResolver等等常用的参数解析器。

    在RequestMappingHandlerAdapter中的getDefaultArgumentResolvers方法中硬编码了它们,而且顺序是固定无法改变的。

    Cookie的注入

    只要实现了HandlerMethodArgumentResolver就可以实现参数注入,以Spring Mvc自带的ServletCookieValueMethodArgumentResolver。

    因为从request从取出cookie值本身是一件相对简单的事情,所以这个类是一个很好的学习的例子。

    @Overrideprotected ObjectresolveName(String cookieName, MethodParameter parameter, NativeWebRequest webRequest)throws Exception {
    HttpServletRequest servletRequest = 
  • 拥抱NoSQL–谈Spring Data MongoDB的简单使用

    先说说MongoDB是什么。

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

    它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

    面向集合存储,易存储对象类型的数据。
    模式自由。
    支持动态查询。
    支持完全索引,包含内部对象。
    支持查询。
    支持复制和故障恢复。
    使用高效的二进制数据存储,包括大型对象(如视频等)。
    自动处理碎片,以支持云计算层次的扩展性
    支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
    文件存储格式为BSON(一种JSON的扩展)
    可通过网络访问

    MongoDB官网也有各语言所用的API,当然也有Java的了。但是平日写的东西大部分是基于Spring框架的,自然希望对于数据库的操作也在Spring的掌控之下。前几日才Spring的官网看到了SPRING DATA MONGODB,对此很感兴趣稍微试了一下。

    10月24日发布的是Spring Data MongoDB 1.0.0.M5 Released。自然还需要Spring Framework哈。

    首先引用相关的包,主要是以下两个:

    spring-data-mongodb-1.0.0.M4.jar

    spring-data-commons-1.2.0.M1.jar

    其他诸如mongo-java-driver.jar的还是需要的,看自己的需要。

    下面开始我们的操作了。

    1.首先注册一个Mongo的实例

    (1)方法一

    @Configurationpublic class AppConfig {
    public @Bean Mongomongo()throws UnknownHostException