spring的设计模式
策略模式
策略模式: 一个接口下有多个实现类,每个实现类处理的情况各不相同。
注意事项:
- 使用@Component注解对当前类进行标注,将其声明为Spring容器所管理的一个bean;
- 声明一个返回boolean值的方法,通过这个方法来控制当前实例是否为处理目标request的实例;
- 声明一个方法用来判断类型;
- 声明一个方法用于处理业务逻辑;
- 传一个对象进行,而不是简简单单的基本类型的变量,这样做的好处是后续如果要在Request中新增字段,那么就不需要修改接口的定义和已经实现的各个子类的逻辑;
工厂模式
工厂模式: 定义一个工厂方法,通过传入不同的参数,返回不同的实例,利用该实例来处理业务逻辑。工厂方法的返回值是一个接口,子类实例的业务逻辑则封装在其中,将外层的调用逻辑于具体的子类获取逻辑进行分离。
BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
单例模式
Bean默认就是单例模式
代理模式
Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
模板方法
用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
观察者模式
定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。
建造者模式
概念:
- 为通过一定的参数,通过一定的业务逻辑来最终生成某个对象。如果仅仅只是使用lombok的这种方式,其本质上也还是创建了一个简单的bean,这个与通过getter和setter方式构建一个bean是没有什么大的区别的;
- 在Spring框架中,使用设计模式最大的问题在于如果在各个模式bean中能够注入Spring的bean,如果能够注入,那么将大大的扩展其使用方式。因为我们就可以真的实现通过传入的简单的几个参数,然后结合Spring注入的bean进行一定的处理后,以构造出我们所需要的某个bean。
使用说明:
- 在Builder类上必须使用@Scope注解来标注该实例为prototype类型,因为很明显,我们这里的Builder实例是有状态的,无法被多线程共享;
- 在Builder.build()方法中,我们可以通过传入的参数和注入的bean来进行一定的业务处理,从而得到构建一个所需要的参数;
- Builder类必须使用static修饰,因为在Java中,如果内部类不用static修饰,那么该类的实例必须依赖于外部类的一个实例,而我们这里本质上是希望通过内部类实例来构建外部类实例,也就是说内部类实例存在的时候,外部类实例是还不存在的,因而这里必须使用static修饰;
- 根据标准的Builder模式的使用方式,外部类的各个参数都必须使用final修饰,然后只需要为其声明getter方法即可。