Spring用到如下这些设计模式:
工厂模式(简单工厂模式,工厂方法模式),单例模式,适配器模式,代理模式,观察者模式,模板模式
工厂就是处理创建对象的细节,而简单工厂模式就是将创建对象的细节交到了其他类,简单工厂将全部的事情,都在那个类中处理完了,我们只需要从该类中取出对象即可。
符合该模式的就是 Spring中的 BeanFactory接口,我们用的ApplicationContext就是它的实现类。
想想我们是如何使用这个类的:
ApplicationContext context = new ClassPathXmlApplicationContext("/ApplicationContext.xml"); ServiceA serviceA = context.getBean("ServiceA", ServiceA.class); ServiceB serviceB = context.getBean("ServiceB", ServiceB.class); First bean = context.getBean(First.class);
如上,我们就是直接将创建对象的 *** 作交给了ClassPathXmlApplicationContext这个类,然后我们直接从中取出对象就完了。这就是简单工厂的实现。
工厂方法模式FactoryBean这个接口就是典型的工厂方法模式,
工厂方法模式就是定义一个创建对象的接口,由子类去决定要实例化的类是哪一个,将对象的实例化推迟到子类。
FactoryBean定义如下:
public interface FactoryBean{ T getObject() throws Exception; Class> getObjectType(); default boolean isSingleton() { return true; }
getObject()就是它提供给子类的接口。
单例模式单例模式确保一个类仅有一个实例,提供一个访问它的全局访问点。Spring 创建 Bean 实例默认是单例的。
适配器模式适配器模式将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间
SpringMVC中的适配器HandlerAdatper。
我们常用的都是使用 Controller去处理请求,但是Spring里面不止提供了 Controller来处理请求,还有Servlet,HttpRequestHandler这几种,当请求过来时,需要先判断是由哪一个处理器处理请求,然后根据它是哪一种接口的实现类调用相应的方法。当增加新的接口,需要修改原来的逻辑,违反了开闭原则(对修改关闭,对扩展开放)。
Spring提供了一个适配器接口,每一种 处理器(Controller接口,Servlet接口,HttpRequestHandler接口)对应一种 HandlerAdapter 实现类,当请求过来,SpringMVC会调用getHandler()获取处理该请求的处理器,然后获取该处理器对应接口的对应的HandlerAdapter,最后调用HandlerAdapter的handle()方法处理请求,实际上调用的是Controller的handleRequest()
或者是Servlet的service()方法,或 HttpRequestHandler的handleRequest()方法
每次添加新的 Controller 时,只需要增加一个适配器类就可以,无需修改原有的逻辑。
代理模式代理模式就是为另一个对象提供一个替身来控制对这个对象的访问。
spring 的 aop 使用了动态代理将切面逻辑织入到切入点,有两种方式JdkDynamicAopProxy和Cglib2AopProxy。
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
spring 中 观察者模式常用的地方是 listener 的实现,如ApplicationListener。
模板方法模式是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
Spring 中 jdbcTemplate 等,就使用到了模板模式,
publicT execute(ConnectionCallback action) throws DataAccessException { Connection con = DataSourceUtils.getConnection(obtainDataSource()); try { // Create close-suppressing Connection proxy, also preparing returned Statements. Connection conToUse = createConnectionProxy(con); return action.doInConnection(conToUse); } finally { DataSourceUtils.releaseConnection(con, getDataSource()); } }
如上, jdbcTemplate的 execute() 方法定义了 获取连接–>执行sql语句—>关闭连接这样的逻辑顺序,然后具体 *** 作交给了ConnectionCallback去做。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)