Java Builder设计模式

适用场景:复杂对象的组装和创建
建造者模式,是为了将构建复杂对象的过程和它的部件解耦。
它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。
使用者可以在不知道内部的具体构建细节。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class Address {
private final String province;
private final String city;
private final String area;
private final String street;
public static class Builder {
private String province;
private String city;
private String area;
private String street;
public Builder() {
}
public Builder province(String province) {
this.province = province;
return this;
}
public Builder city(String city) {
this.city = city;
return this;
}
public Builder area(String area) {
this.area = area;
return this;
}
public Builder street(String street) {
this.street = street;
return this;
}
public Address build() {
return new Address(this);
}
}
private Address(Builder builder) {
province = builder.province;
city = builder.city;
area = builder.area;
street = builder.street;
}
}

Spring Boot中使用@ConditionalOnExpression注解

1
2
3
4
5
6
7
8
9
// properties中可以配置isEnabled的值,true即开启Bean注入,false为不注入
@Configuration
@ConditionalOnExpression("${isEnabled}")
public class SomeConfiguration {
@Bean
public ... ...(... ...) {
// 实现
}
}

Maven中的dependencyManagement

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# pom.xml
# 只是对版本进行管理,不会实际引入jar包
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.7</version>
</dependency>
</dependencies>
</dependencyManagement>
# 实际下载jar包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>

浅析Java关键字 transient

1
2
3
transient官方解释:
Variables may be marked transient to indicate that they are not part of the persistent state of an object.
变量可以被标记为瞬态,表示它们不是对象的持久状态的一部分。

Java中transient关键字可以让被修饰的变量不被序列化,只需要实现Serilizable接口,将不需要
序列化的属添加transient,在序列化对象时此属性就不会被序列化到指定的目的地中。

Spring事务的七种传播行为,四种特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
spring默认传播行为。
如果有事务,那么加入事务,没有的话新建一个。
@Transactional(propagation=Propagation.REQUIRED)
容器不为这个方法开启事务
@Transactional(propagation=Propagation.NOT_SUPPORTED)
创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
两个事务没有依赖关系,可以实现新事务回滚了,但外部事务继续执行
@Transactional(propagation=Propagation.REQUIRES_NEW)
必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.MANDATORY)
必须在一个没有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER)
如果其他bean调用这个方法,在其他bean中声明事务,那就用事务,如果其他bean没有声明事务,那就不用事务。
@Transactional(propagation=Propagation.SUPPORTS)
如果当前存在事务,则在嵌套事务内执行,如果当前不存在事务,则创建一个新的事务,嵌套事务使用数据库中的保存点来实现,即嵌套事务回滚不影响外部事务,但外部事务回滚将导致嵌套事务回滚。
@Transactional(propagation=Propagation.Nested)
1
2
3
4
5
四种特性:
1、原子性:事务包含的所有操作要么全部成功,要么全部失败回滚。
2、一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
3、持久性:事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
4、隔离性:当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

按指定数量拆分List及Mybatis批量插入

当数据量过多需要插入到数据库时,因为数据库连接需要的时间较长,所以可以选择连接池并批量插入数据,从而提高效率。
1.按指定数量拆分List

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
final int LIST_SIZE = 50;
List<Object> objList = new ArrayList<>();
// 如果小于50个对象,直接插入
if (objList.size() <= LIST_SIZE) {
for (Object obj : objList) {
mapper.insert(obj);
}
} else {
Object[] params = objList.toArray(new Object[]{});
int len = params.length;
for (int i = 1; i <= len / LIST_SIZE; i++) {
Object[] tmp = Arrays.copyOfRange(params, (i - 1) * LIST_SIZE, i * LIST_SIZE);
List<Object> paramList = Arrays.asList(tmp);
mapper.insertByBatch(paramList);
if (len / LIST_SIZE == i && len % LIST_SIZE > 0) {
tmp = Arrays.copyOfRange(params, objList.size() / LIST_SIZE * LIST_SIZE, len);
paramList = Arrays.asList(tmp);
mapper.insertByBatch(paramList);
}
}
}

2.Mybatis批量插入数据

1
2
3
4
5
6
<insert id="insertByBatch" parameterType="java.util.List">
INSERT INTO table (id, code, name) VALUES
<foreach collection="paramList" item="param" index="index" separator=",">
(#{param.id}, #{param.code}, #{param.name}
</foreach>
</insert>

Spring Boot事务管理

#前言
在开发时,由于数操作在顺序执行的过程中,任何一步操作都有可能发生异常,异常会导致后续操
作无法完成,此时由于业务逻辑并未正确的完成,之前成功操作数据的并不可靠,需要在这种情况
下进行回退。事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须
成功执行,只要有发生异常就回退到事务开始未进行操作的状态。事务管理是Spring框架中最为常
用的功能之一,在开发应用时,大部分情况下也都需要使用事务。

#事务回滚规则
事务管理器回滚一个事务的推荐方法是在当前事务的上下文内抛出异常。事务管理器会捕捉任何未
处理的异常,然后依据规则决定是否回滚抛出异常的事务。

#操作
用@Transactional注解来声明一个函数需要被事务管理,一般在service层使用@Transactional
来对各个业务逻辑进行事务管理的配置。

@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有
public方法将都具有该类型的事务属性,同时,也可以在方法级别使用该标注来覆盖类级别的定义。

虽然@Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring建议不
要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。

@Transactional 注解应该只被应用到public方法上,这是由Spring AOP的本质决定的。
如果在protected、private或者默认可见性的方法上使用@Transactional注解,这将被忽略,
也不会抛出任何异常。

@EnableTransactionManagement
开启注解事务管理,等同于xml配置文件中的

#对于查询的注解处理
不需要事务管理的(只查询的)方法
@Transactional(propagation=Propagation.NOT_SUPPORTED)
在整个方法运行前就不会开启事务
@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
这样就做成一个只读事务,可以提高效率

为我的新朋友“咕咕”安个家

Hello my memobird.
我的咕咕号:768047。欢迎加好友调戏!
很久前就在网上看到有人种草了,今年双十二在JD果断下单了,一天到货,物流还是棒棒的。
开机吓了一跳,自动打印了使用方法,2333,连上WIFI开始了正常模式。(要是充电的就更好了唉)
知乎上还有一些有趣的玩法!MEMOBIRD 咕咕机有哪些有趣的玩法?
因为咕咕有自己的开放平台,准备搞一搞有趣的东西开发一下,顺便也学习学习新的语言喽。
memobird
还有啦,希望在2018年,能找到我咕咕机的另一个伴侣~
更新下,2017.12.14日部分咕咕~
memobird
memobird
memobird

记录APACHE-HTTPS的配置以及遇到的一些陷阱

在开启HTTPS之前,需要服务器防火墙(如果有使用iptables或firewall)

<1>httpd.conf

1
2
3
4
5
6
7
8
9
#监听80和443端口
Listen 80
Listen 443
#加载mod_ssl模块
EnableSendfile on
IncludeOptional conf.d/*.conf
LoadModule ssl_module modules/mod_ssl.so
Include conf.d/ssl.conf

<2>ssl.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#注意,在此配置文件中不需要监听443,防止重复监听
#在对443虚拟路径映射的时候,需要填写固定IP,不要使用*代替
<VirtualHost ip:443>
#此处填写域名名称
ServerName domain
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
#SSL加密密钥,可以在APACHE根路径下新建cert并存放密钥文件
SSLCertificateFile /etc/httpd/cert/public.pem
SSLCertificateKeyFile /etc/httpd/cert/214047770560394.key
SSLCertificateChainFile /etc/httpd/cert/chain.pem

在配置好文件后,需要重新启动APACHE服务

1
2
3
srevice iptables restart
service httpd restart
service httpd status

开启301;HTTP重定向到HTTPS

1
2
3
4
5
6
7
8
9
10
#在所需的Directory中,修改AllowOverride为All
<Directory "/var/www/html">
AllowOverride All
</Directory>
#在网站跟路径增加.htaccess,并写入下面脚本
RewriteEngine On
RewriteBase /
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://domain/$1 [R=301,L]