springboot怎么改域名?Spring Boot数据源配置原理是什么?

Spring Boot是一个轻量级框架,可以用来轻松地创建独立的、生产级的、基于Spring且能直接运行的应用。其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。那springboot怎么改域名?下面来我们就来给大家讲解一下。

1.idea打包springboot的项目的方式有很多,这里我们使用maven进行打包开发,

springboot怎么改域名?Spring Boot数据源配置原理是什么?.png

注意:不要忘记本地安装maven呦

mvn clean package

2.打包完成之后就是上传到服务器,这有很多的上传工具MobaXterm filezilla,上传之前要仔细检查一些数据库配置还要其他的配置。不然还要从新上传。

nohup java -jar 项目名称 &(这样可以让项目一直在后台运行)

敲重点:ps -ef | grep java 查看进程

3.项目运行起来之后,你要把域名做解析,这个很好解析。上图

1.png

4.这样我们就可以 域名+port 访问项目,但是没见上线的哪家网站是这样的。所以我们要做一个域名的反向代理,nginx作为中间转发的中间件

5.下载nginx。一种是源码安装,一种是yum安装。介绍最简单的yum安装

yum install nginx

6.执行命令 vi /etc/nginx/nginx.conf 编辑 Nginx 的配置文件,将默认的server {...} 配置修改为以下内容:

2.png

第二个箭头写域名,第三个是代理的本地ip

Spring Boot数据源配置原理是什么?

我们知道,Spring Boot 中几乎所有的默认配置都是通过配置类 XxxAutoConfiguration 进行配置的,Spring Boot 数据源也不例外,它的自动配置类是:DataSourceAutoConfiguration。

DataSourceAutoConfiguration 中共包括以下 5 个内部静态类:

· EmbeddedDatabaseCondition

· PooledDataSourceAvailableCondition

· PooledDataSourceCondition

· PooledDataSourceConfiguration(池化数据源自动配置类)

· EmbeddedDatabaseConfiguration(内嵌数据源自动配置类)

其中,PooledDataSourceConfiguration 和 EmbeddedDatabaseConfiguration 为使用了 @Configuration 注解的自动配置类,其余 3 个为限制条件类。

EmbeddedDatabaseConfiguration

顾名思义,EmbeddedDatabaseConfiguration 是内嵌数据源的自动配置类,该类中并没有任何的方法实现,它的主要功能都是通过 @Import 注解引入 EmbeddedDataSourceConfiguration 类来实现的。

@Import({EmbeddedDataSourceConfiguration.class})

EmbeddedDataSourceConfiguration 向容器中添加了一个 Spring Boot 内嵌的数据源,该数据源支持 HSQL,H2 和 DERBY 三种数据库,其部分代码如下。

@Configuration(
    proxyBeanMethods = false
)
@EnableConfigurationProperties(
{
    DataSourceProperties.class
})
public class EmbeddedDataSourceConfiguration implements BeanClassLoaderAware
{
    private ClassLoader classLoader;
    public EmbeddedDataSourceConfiguration()
    {}
    public void setBeanClassLoader(ClassLoader classLoader)
    {
        this.classLoader = classLoader;
    }
    //向容器中添加 Spring Boot 内嵌的数据源
    @Bean(
        destroyMethod = "shutdown"
    )
    public EmbeddedDatabase dataSource(DataSourceProperties properties)
    {
        return (new EmbeddedDatabaseBuilder())
            .setType(EmbeddedDatabaseConnection.get(this.classLoader)
                .getType())
            .setName(properties.determineDatabaseName())
            .build();
    }
}

通过上面的分析,我们知道自动配置类 EmbeddedDatabaseConfiguration 的作用是向容器中添加一个内嵌的数据源(DataSource),但这是有条件限制的。

在 EmbeddedDatabaseConfiguration 类上还使用一个 @Conditional 注解,该注解使用了 DataSourceAutoConfiguration 的内部限制条件类 EmbeddedDatabaseCondition 来进行条件判断。

@Conditional({DataSourceAutoConfiguration.EmbeddedDatabaseCondition.class})

EmbeddedDatabaseCondition 主要用来检测容器中是否已经存在池化数据源(PooledDataSource)。若容器中存在池化数据源时,则 EmbeddedDatabaseConfiguration 不能被实例化。只有当容器中不存在池化数据源时,EmbeddedDatabaseConfiguration 才能被实例化,才能向容器中添加内嵌数据源(EmbeddedDataSource)。

PooledDataSourceConfiguration

PooledDataSourceConfiguration 是池化数据源的自动配置类,该类上使用了一个 @Conditional 注解,该注解使用了 DataSourceAutoConfiguration 的内部限制条件类 PooledDataSourceCondition 来进行条件判断。

@Conditional({DataSourceAutoConfiguration.PooledDataSourceCondition.class})

PooledDataSourceCondition 与 EmbeddedDatabaseCondition 一样,也是用来检测容器中是否已经存在池化数据源的,但不同的是,PooledDataSourceConfiguration 是只有当容器中存在池化数据源时, 才可以被实例化,才可以向容器中添加池化数据源。

与 EmbeddedDatabaseConfiguration 一样,PooledDataSourceConfiguration 类中也没有任何的方法实现,它的所有功能都是通过 @Import 注解引入其他的类实现的。

@Import({Hikari.class, Tomcat.class, Dbcp2.class, OracleUcp.class, 
Generic.class, DataSourceJmxConfiguration.class})

PooledDataSourceConfiguration 通过 @Import 注解引入了 Hikari、Tomcat、Dbcp2、OracleUcp 和 Generic 五个数据源配置类,它们都是 DataSourceConfiguration 的内部类,且它们的功能类似,都是向容器中添加指定的数据源。

下面我们以 Hikari 为例进行分析,Hikari 的源码如下。

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnClass(
{
    HikariDataSource.class
})
@ConditionalOnMissingBean(
{
    DataSource.class
})
@ConditionalOnProperty(
    name = {
        "spring.datasource.type"
    }
    , havingValue = "com.zaxxer.hikari.HikariDataSource"
    , matchIfMissing = true
)
static class Hikari
{
    Hikari()
    {}
    @Bean
    @ConfigurationProperties(
        prefix = "spring.datasource.hikari"
    )
    HikariDataSource dataSource(DataSourceProperties properties)
    {
        HikariDataSource dataSource = (HikariDataSource) DataSourceConfiguration.createDataSource(properties, HikariDataSource.class);
        if (StringUtils.hasText(properties.getName()))
        {
            dataSource.setPoolName(properties.getName());
        }
        return dataSource;
    }
}

在 Hikari 类中,主要使用以下注解:

· @Configuration:表示当前类是一个配置类;

· @ConditionalOnMissingBean({DataSource.class}):表示容器中没有用户自定义的数据源时,该配置类才会被实例化;

· @ConditionalOnClass({HikariDataSource.class}) :表示必须在类路径中存在 HikariDataSource 类时,Hikari 才会实例化。而 HikariDataSource 类是由 spring- boot-starter-jdbc 默认将其引入的,因此只要我们在 pom.xml 中引入了该 starter, Hikari 就会被实例化(这也是 Spring Boot 2.x 默认使用 HikariCP 作为其数据源的原因)。;

· @ConditionalOnProperty( name = {"spring.datasource.type"},havingValue = "com.zaxxer.hikari.HikariDataSource",matchIfMissing = true): 表示当 Spring Boot 配置文件中,配置了 spring.datasource.type = com.zaxxer.hikari.HikariDataSource(明确指定使用 Hikari 数据源)或者不配置 spring.datasource.type(即默认情况)时,Hikari 才会被实例化。

Hikari 类通过 @Bean 注解向容器中添加了 HikariDataSource 组件,该组件的实例对象是通过调用 DataSourceConfiguration 的 createDataSource() 方法得到的,代码如下。

@Bean
@ConfigurationProperties(
    prefix = "spring.datasource.hikari"
)
HikariDataSource dataSource(DataSourceProperties properties)
{
    HikariDataSource dataSource = (HikariDataSource) DataSourceConfiguration.createDataSource(properties, HikariDataSource.class);
    if (StringUtils.hasText(properties.getName()))
    {
        dataSource.setPoolName(properties.getName());
    }
    return dataSource;
}

在 createDataSource() 方法中,调用 DataSourceProperties 的 initializeDataSourceBuilder() 来初始化 DataSourceBuilder,源码如下。

protected static < T > T createDataSource(DataSourceProperties properties, Class < ? extends DataSource > type)
{
    return properties.initializeDataSourceBuilder()
        .type(type)
        .build();
}

initializeDataSourceBuilder() 方法通过调用 DataSourceBuilder 的 create() 方法创建 DataSourceBuilder 对象,并根据 Spring Boot 的配置文件(application.properties/yml)中的配置,依次设置数据源类型、驱动类名、连接 url、 用户名和密码等信息。

public DataSourceBuilder < ? > initializeDataSourceBuilder()
{
    return DataSourceBuilder.create(this.getClassLoader())
        .type(this.getType())
        .
    driverClassName(this.determineDriverClassName())
        .url(this.determineUrl())
        .username(this.determineUsername())
        .password(this.determinePassword());
}

上面提到 spring.datasource.type 默认是可以不用配置的,因此在 createDataSource() 方法在获取到回传回来的 DataSourceBuilder 对象后,还需要将其 type 属性再次设置为 HikariDataSource,并调用 DataSourceBuilder 的 build() 方法,完成 HikariDataSource 的初始化。

3.jpg

dataSource() 方法获得数据源对象,并设置了连接池的名字(name),注入到容器中。

4.jpg

这样我们就完成了对 Spring Boot 数据源自动配置原理的分析,总之pring Boot最大的好处就是简单、快捷、方便,所以掌握好 Spring Boot相关操作很有必要!最后大家如果想要了解更多java架构师知识,敬请关注奇Q工具网。

推荐阅读:

程序员面试是托关系能过吗?程序员面试要做哪些准备?

java反射机制的优缺点是什么?java反射机制的优缺点介绍

java接口可以创建对象吗?java接口如何实现?