MENU

Spring Boot

Spring Boot 与AOP

AOP(Aspect-oriented programming)译为面向切面编程,是的一种程序设计思想,它将横切关注点业务主体进行分离,以提高程序代码的模块化程度(解藕)。在现有代码基础上增加额外的Advice(通知)机制,对被声明为Pointcut(切点)的代码块进行统一管理;从核心关注点中分离出横切关注点是面向切面的程序设计的核心概念;像记录操作日志、记录执行时间、权限控制等功能,如果在代码实现上逐个方法去添加这些处理代码会造成代码冗余和代码入侵,也很难维护;而AOP就能很好的处理这些问题。

Read More

Spring Boot 整合 RabbitMQ

Spring Boot整合RabbitMQ是非常容易的,下面将通过一个最简单的例子实现消息的发送和接收;仅引用spring-boot-starter-amqp这个starter即可完成rabbitMQ的整合。

首先,创建一个maven项目,pom.xml加入依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

额外增加pring-boot-starter-web是为了方便调用生产消息。

增加配置文件application.yml,配置RabbitMQ相关信息:

spring:
  rabbitmq:
    host: 66.66.66.66
    port: 5672
    username: wangxuesong
    password: 123456

Read More

Spring Boot 中 health 报错问题

今天部署了一个最简单的Spring Boot项目,但是curl localhost:9090/health一直报500;报错信息显示是rabbitmq相关的错误,但是项目中根本没有用到rabbitmq。

{
    "timestamp": 1507777390848,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "java.lang.NoSuchMethodError",
    "message": "com.rabbitmq.client.ConnectionFactory.newConnection(Ljava/util/concurrent/ExecutorService;[Lcom/rabbitmq/client/Address;Ljava/lang/String;)Lcom/rabbitmq/client/Connection;",
    "path": "/health"
}

NoSuchMethodError错误感觉是缺少依赖包;这就奇怪了,明明没用到rabbitmq啊。还是从maven依赖入手,查看关于rabbitmq的依赖mvn dependency:tree | grep rabbitmq

[INFO] |  +- com.rabbitmq:amqp-client:jar:3.5.7:compile
[INFO] |  |  +- com.rabbitmq:http-client:jar:1.1.1.RELEASE:compile

Read More

Spring Boot 之外置配置

Spring Boot 之 Configuration中,已经了解自动配置的基本原理,通过基本配置可以实现很多功能,让我们更关注业务本身;但是不可避免需要自定义配置,比如将自动配置的8080端口修改为8081,或者配置数据源信息等等。

Spring Boot支持多种方式外置配置,比如环境变量、Java系统属性、JNDI、命令行参数或者属性文件等。以最简单的修改Tomcat监听端口为例。

使用命令行参数--server.port=8081,启动项目;监听端口已经为8081。

Tomcat started on port(s): 8081 (http)

image

最常见的方式是使用配置文件application.yml或者application.properties;在resources目录下创建application.yml:

server:
    port: 9090

Read More

Spring Boot 之 Configuration

在上一篇的Starter项目中,加入了两三个依赖就完成了一个CRUD的Web项目;Spring Boot是如何实现自动配置的呢?

如果是一个普通的Spring项目,我们需要较多的配置,比如web.xml中配置ContextLoaderListener,配置DispatcherServlet等,在Spring的配置文件中配置数据源、页面模版、JOSN序列化、静态资源等等;而在Spring Boot项目中,这些都在内部进行了配置,完全的约定优于配置,像端口监听8080、把/static目录暴露为静态资源、Thymeleaf模版文件要放在/templates目录。

在项目的依赖中找到spring-boot-autoconfigure这个jar,会发现很多配置类,挑个简单的打开看看,就ThymeleafProperties吧,下面是代码片段:

@ConfigurationProperties("spring.thymeleaf")
public class ThymeleafProperties {
    private static final Charset DEFAULT_ENCODING = Charset.forName("UTF-8");
    private static final MimeType DEFAULT_CONTENT_TYPE = MimeType.valueOf("text/html");
    public static final String DEFAULT_PREFIX = "classpath:/templates/";
    public static final String DEFAULT_SUFFIX = ".html";
    private boolean checkTemplate = true;
    private boolean checkTemplateLocation = true;
    private String prefix = "classpath:/templates/";
    private String suffix = ".html";
    private String mode = "HTML5";
    private Charset encoding;
    private MimeType contentType;
    private boolean cache;
    private Integer templateResolverOrder;
    private String[] viewNames;
    private String[] excludedViewNames;
    private boolean enabled;

看到这大概就明白这些自动配置是怎么回事了,配置一个都没少只是换地方了;不过,还有一个问题,这么配置项都在项目启动时进行配置肯定是不行;一定是按需配置的,依赖了Thymeleaf才去启动Thymeleaf的配置。这就用到了Spring 4.0的新特性,条件化配置;条件成立时才启用配置。

Spring Boot中定义了很多条件化配置的注解,用于配置类;配置类和条件化注解共同构成了自动配置。

Read More