ORM框架-发展历史

贴一段最常见的传统Jdbc数据访问代码:

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
public class JdbcDemo {
public static void main(String[] args) {
ResultSet re = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
Connection connection = DriverManager.getConnection(
"jdbc:mysql://10.0.12.72:3306/mybatis-demo","root","C!Fr0ShoW9Nu");
Statement statement = connection.createStatement();
String sql = "SELECT * FROM blog";
re = statement.executeQuery(sql);
while(re.next()){
Blog blog = new Blog();
blog.setBid(re.getInt("bid"));
blog.setName(re.getString("name"));
blog.setAuthorId(re.getInt("author_id"));
System.out.println(blog);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

分析这段代码能发现这种连接数据库获取对象的方式有四大弊端:

1、 造成代码重复

2、 资源管理问题,像Connection、StateMent、ResultSet这些资源需要用户去管理,很可能造成资源泄露

查看更多

SpringBoot启动之上下文刷新(一)

在学习Context之前我们得先区分一下ApplicationContext和BeanFactory两者之间的关系。

在我们的理解中,容器应该是一个空间的概念,用于存放事物的东西。在spring中,存放的是Bean。而BeanFactory提供了这么一个空间用于存放Bean,所以BeanFactory才是Bean所在的主要容器,而不是我们一直说的ApplicationContext。

既然ApplicationContext不是容器,那它又是啥呢?我们称之为”上下文”。”上下文”的概念我们也许不见得那么熟,但是”场景”,”场所”这样的概念我们应该就比较熟悉了。比如说”拍摄场景”,”交易场所”等。它们的共同点都是事件发生的地方。所以ApplicationContext正是spring定义的应用程序的事件发生场所,也就是所谓的应用上下文。

上面,我了解了BeanFactory作为Bean容器,而ApplicationContext作为上下文。那么Bean容器和上下文之间是什么关系呢?我们可以看一个代码片段:

1
2
3
4
5
6
// 通用的应用上下文实现
public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry {
// 默认BeanFactory的实现
private final DefaultListableBeanFactory beanFactory;
...
}

查看更多

SpringBoot启动之环境准备阶段

环境对象用来干什么的?

环境对象用来收集项目的各种配置,并且可以做到在不同环境(开发环境、测试环境、生产环境)中,这些配置可以很方便的切换。

在数据结构的设计上,环境包括两块内容:profiles 和 properties

profiles 就是环境名称,比如测试环境test、开发环境dev、生产环境pro、默认的default等。

properties 是环境属性,由一对对的 key:value 组成

查看更多

SpringBoot启动之事件机制

springboot启动过程分为几个步骤,准备环境-准备上下文-上下文刷新(ioc容器初始化),在每个步骤前后,主流程会触发一些事件的发布,启动初期注册好的一系列监听器监听到感兴趣的事件后,去执行一些特定的初始化任务。

这种设计,可以很好地将不同阶段初始化的内容从主流程中解耦出来,减少主流程的复杂性。所以要学习springboot启动过程,首先要了解事件的发布和监听机制。

首先我们看一下EventObject,这个类定义了一个事件,该类中的source属性可以用来表示事件源,即哪个对象触发的事件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package java.util;

public class EventObject implements java.io.Serializable {
private static final long serialVersionUID = 5516075349620653480L;
/**
* 触发事件时将触发对象传进来
*/
protected transient Object source;

public EventObject(Object source) {
if (source == null)
throw new IllegalArgumentException("null source");

this.source = source;
}
...// getSource & toString
}

其次我们需要了解一下关于事件监听的接口EventListener:

查看更多

SpringCloud-服务网关zuul

Zuul是Netflix开源的微服务网关,可以和Eureka、Ribbon、Hystrix等组件配合使用,Spring Cloud对Zuul进行了整合与增强。

Zuul的主要功能是路由转发和过滤器。

zuul默认和Ribbon结合实现了负载均衡的功能。

Zuul默认使用的HTTP客户端是Apache HTTPClient,也可以使用RestClient或okhttp3.OkHttpClient。

zuul原理及可用功能

zuul的核心是一系列的filters, 其作用类比Servlet框架的Filter,或者AOP。zuul把请求路由到用户处理逻辑的过程中,这些filter参与一些过滤处理,比如Authentication,Load Shedding等。

查看更多