Spring Boot启动配置原理
Spring Boot启动配置原理几个重要的事件回调机制配置在META-INF/spring.factories
ApplicationContextInitializer
SpringApplicationRunListener
只需要放在ioc容器中ApplicationRunner
CommandLineRunner
启动流程:1、创建SpringApplication对象
12345678910111213141516initialize(sources);private void initialize(Object[] sources) { //保存主配置类 if (sources != null && sources.length > 0) { this.sources.addAll(Arrays.asList(sources)); } //判断当前是否一个web应用 this.webEnvironment = deduceWebEnvironment(); //从类路径下 ...
Spring Boot自动配置原理
Spring Boot自动配置原理
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。它使用“习惯优于配置”的理念可以让你的项目快速运行部署。使用Spring Boot可以不用或者只需要很少的Spring配置。
Spring Boot核心的功能就是自动配置。它会根据在类路径中的jar、类自动配置Bean,当我们需要配置的Bean没有被Spring Boot提供支持时,也可以自定义自动配置。
自动配置原理spring-boot-starter-==web==:spring-boot-starter:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件;
Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器
主程序类,主入口类/**
* @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
...
设计模式-迭代器模式
设计模式-迭代器模式
提供一种方法访问一个聚合对象中的各个元素,而又无需暴露改对象的内部表示
应用场景:遍历一个聚合对象,当你需要访问一个聚集对象,
而且不管这些对象是什么都需要遍 历的时候,
就应该考虑用迭代器模式。
实例:JAVA 中的 iterator
12345678/* * 创建一个叙述导航方法的 Iterator 接口和一个返回迭代器的 Container 接口 * 实现了 Container 接口的实体类将负责实现 Iterator 接口 */public interface Iterator { public boolean hasNext(); public Object next();}
1234public interface Container { public Iterator getIterator();}
1234567891011121314151617181920212223242526272829303132/** * 创建实现了 Container 接口的实体类。 * ...
设计模式-抽象工厂模式
设计模式-抽象工厂模式
提供一个产品类的接口,产品类均要实现这个接口 提供一个工厂类的接口。工厂类均要实现这个接口(即抽象工厂)。 由工厂实现类创建产品类的实例。工厂实现类应有一个方法,用来实例化产品类。 提供多个工厂实现类。工厂实现类分别构造不通产品族的产品。主要解决接口选择的问题
实例:
应用场景: 在编码时不能预见需要创建哪种类的实例。系统不应依赖于产品类实例如何被创建、组合和表达的细节。
抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,
并且这些对象是相关的,也就是说必须一起创建出来。
而工厂模式只是用于创建一个对象,这和抽象工厂模式有很大不同。抽象工厂模式用到了工厂模式来创建单一对象,
1234567891011121314package main.java.com.usher.DesignPatterns.AbstractFactory;/** * 创建对象的家族这一概念是在 Client 体现, Client 要通过 AbstractFactory 同时调用两个方法来创建出两个对象, 在这里这两个对象就有很大的相关性,Client 需要同时 ...
设计模式-模板方法模式
设计模式-模板方法模式
模板方法模式中定义一个抽象类,有一个主方法,再定义1…n个方法,可以是抽象的,也可以是实际的方法,定义一个类,
继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用为防止恶意操作,一般模板方法都加上 final 关键词
主要解决一些方法通用,却在每一个子类都重新写了这一方法
模板方法模式定义一个操作中的算法的骨架,将一些步骤延迟到子类中,
模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。应用场景如下:对于一些功能,在不同的对象身上展示不同的作用,但是功能的框架是一样的。实例:spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
12345678910111213141516171819202122public abstract class Game { /** * 创建一个定义操作的 Game 抽象类,其中,模板方法设置为 final,这样它就不会被重写。 ...
设计模式-工厂方法模式
设计模式-工厂方法模式
定义一个创建对象的接口,但是由子类决定要实例化那个类,工厂方法把实例化推迟到子类,主要解决接口选择的问题
实例:java.util.Collection 接口的 iterator 方法,hibernate里通过sessionFactory创建session,
日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时
在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象
12345678public abstract class Factory { public abstract Product factoryMethod(); public void doSomething(){ Product product = factoryMethod(); }}
123456789public class ConcreteFactory extend ...
设计模式-简单工厂模式
设计模式-简单工厂模式
在创建一个对象时不向客户暴露内部细节 它把实例化的操作单独放到一个类中,这个类就成为简单工厂类, 让简单工厂类来决定应该用哪个子类来实例化。 这样做能把客户类和具体子类的实现解耦,
客户类不再需要知道有哪些子类以及应当实例化哪个子类。 因为客户类往往有多个,如果不使用简单工厂,所有的客户类都要知道所有子类的细节。 而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。
1234567891011public class SimpleFactory { public Product createProduct(int type){ if (type == 1){ return new ConcreteProduct1(); }else if (type == 2){ return new ConcreteProduct2(); } return new Concret ...
设计模式-观察者模式
设计模式-观察者模式
观察者模式又被称作发布/订阅模式,定义了对象间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
观察者模式属于行为型模式,主要解决一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
应用场景如下:
a、对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。 b、对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
123456789101112131415161718192021222324252627282930import java.util.ArrayList;import java.util.List;/** 观察者模式使用三个类 Subject、Observer 和 Client。 Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。 我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的 ...
设计模式-策略模式
设计模式-策略模式
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换。
此模式让算法的变化独立于使用算法的客户。
在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。主要解决在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
应用场景如下。
a、 一件事情,有很多方案可以实现。b、我可以在任何时候,决定采用哪一种实现。c.、未来可能增加更多的方案。d、 策略模式让方案的变化不会影响到使用方案的客户。
实例:
系统的操作都要有日志记录,通常会把日志记录在数据库里面,方便后续的管理,但是在记录日志到数据库的时候,可能会发生错误,比如暂时连不上数据库了,那就先记录在文件里面。日志写到数据库与文件中是两种算法,但调用方不关心,只负责写就是。
123456public interface Strategy { public int doOperation(int num1,int num2);}
1234567public class OperationAdd implements ...
设计模式-单例模式
设计模式-单例模式
单例模式确保一个类只有一个实例,并提供一个全局访问点。主要解决一个全局使用的类频繁地创建与销毁
应用场景:线程池、缓存、对话框、处理器偏好设置和注册表的对象等等
确保一个类只有一个实例,并提供了一个全局访问点
类图:
使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。
私有构造函数保证了不能通过构造函数来创建对象实例,
只能通过公有静态函数返回唯一的私有静态变量
懒汉式-线程不安全1234567891011121314151617181920212223242526272829/** * 懒汉式-线程不安全,实例在第一次使用时创建 * 私有静态变量 uniqueInstance 被延迟实例化, * 这样做的好处是,如果没有用到该类,那么就不会实例化 uniqueInstance, * 从而节约资源。 这个实现在多线程环境下是不安全的, 如果多个线程能够同时进入 if(uniqueInstance == null) , 那么就会多次实例化 uniqueInstance。 */public class Singleton { ...