当前位置: 首页 > Linux

Spring中的这些设计模式你都知道吗?

时间:2023-04-06 22:18:51 Linux

设计模式在工作学习中被当作枕边书使用,却常常处于说不用的尴尬境地。不是我们经常忘记,而是我们没有记忆。Spring作为业界的经典框架,无论是在架构设计还是代码编写上都堪称业界典范。好了,废话不多说,下面开始今天的内容。Spring中常用的设计模式有九种,我们用例子来说明。简单工厂模式也称为静态工厂方法(StaticFactoryMethod)模式,但不属于GOF23种设计模式之一。简单工厂模式的本质是一个工厂类根据传入的参数动态决定创建哪个产品类。spring中的BeanFactory就是简单工厂模式的体现。bean对象是通过传入唯一标识获得的,但是是在传入参数之后创建还是在传入参数之前创建,要视具体情况而定。下面的配置是在HelloItxxz类中创建一个itxxzBean。工厂方法模式通常是由应用程序使用new直接创建新的对象。为了分离对象的创建和使用,采用了工厂模式,即应用程序将对象创建和初始化的责任交给工厂对象。通常,应用程序有自己的工厂对象来创建bean。如果把应用自身的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂bean。下面以工厂方法中的静态方法为例进行说明:构建一个config.xm配置文件,并纳入到Spring容器中进行管理。需要通过factory-method指定静态方法名:Test:publicstaticvoidmain(String[]args){//调用getBean()时,返回一个随机数。如果不指定factory-method,则返回一个StaticFactoryBean实例,即返回一个factoryBean实例XmlBeanFactoryfactory=newXmlBeanFactory(newClassPathResource("config.xml"));System.out.println("我是一个IT学习者创建的实例:"+factory.getBean("random").toString());}单例模式保证了一个类只有一个实例,提供了一个访问它的方式全球接入点。spring中的单例模式完成了后半句,提供了一个全局的接入点BeanFactory。但是从构造函数层面没有单例控制,因为spring管理的是任意java对象。核心提示:Spring下默认的bean都是单例的,可以通过singleton="true|false"或者scope="?"来指定。Adapter模式在Spring的Aop中,Advice(通知)用于增强被代理类的功能。Spring实现这个AOP功能的原理是利用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)增强类的方法级方面,即生成代理类代理类的方法,并在代理类的方法之前设置拦截器,通过执行拦截器的重内容来增强代理方法的功能,实现面向切面编程。Adapter类接口:Targetwrapper模式在我们的项目中遇到这样一个问题:我们的项目需要连接多个数据库,不同的客户在每次访问中会根据需要访问不同的数据库。以前我们总是在spring和hibernate框架中配置一个数据源,所以sessionFactory的dataSource属性一直指向这个数据源,保持不变。所有DAO在使用sessionFactory时都是通过这个数据源来访问数据库的。但是现在由于项目的需要,我们的DAO在访问sessionFactory的时候要在多个数据源之间切换,问题就来了:如何让sessionFactory在不同数据源进行数据持久化的时候根据客户的需求动态切换呢?能不能在spring的框架下稍微修改一下就解决了?有没有可以利用的设计模式?首先想到在spring的applicationContext中配置所有的dataSources。这些dataSources可能是多种类型的,比如不同的数据库:Oracle、SQLServer、MySQL等,或者是不同的数据源:比如apache提供的org.apache.commons.dbcp.BasicDataSource,org.springframework.jndi.JndiObjectFactoryBean等然后sessionFactory根据客户端的每次请求,将dataSource属性设置为不同的数据源,从而达到切换数据源的目的。spring中使用的wrapper模式在类名中有两种表现:一种是类名中包含Wrapper,另一种是类名中包含Decorator。基本上,动态地向对象添加一些额外的职责。代理模式为其他对象提供了一个代理来控制对这个对象的访问。从结构上看,它类似于Decorator模式,但Proxy是控制,更像是对功能的限制,而Decorator是增加职责。Spring的Proxy模式体现在aop中,比如JdkDynamicAopProxy和Cglib2AopProxy。观察者模式定义了对象之间一对多的依赖关系。当一个对象的状态发生变化时,所有依赖它的对象都会收到通知并自动更新。spring中观察者模式的常见用法就是监听器的实现。比如ApplicationListener。策略模式定义了一系列算法,将它们一个一个封装起来,并使它们可以互换。此模式使算法能够独立于使用它的客户端而变化。在spring中,实例化对象时使用的是Strategy模式。SimpleInstantiationStrategy中的以下代码说明了策略模式的使用:模板方法模式在一个操作中定义了算法的骨架,并将一些步骤延迟到子类。TemplateMethod使子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。TemplateMethod模式一般需要继承。这里想探讨一下对TemplateMethod的另一种理解。spring中的JdbcTemplate在使用这个类的时候并不想继承这个类,因为这个类的方法太多了,但是我们还是想使用JdbcTemplate已经具备的稳定、公共的数据库连接,那怎么办呢?我们可以把变化的东西提取出来,作为参数传给JdbcTemplate方法。但是变化的是一段代码,这段代码会用到JdbcTemplate中的变量。该怎么办?然后我们使用回调对象。在这个回调对象中,定义一个方法来操作JdbcTemplate中的变量。当我们实现这个方法时,我们会把改动集中在这里。然后我们将这个回调对象传递给JdbcTemplate,完成调用。这可能是不需要继承的模板方法的另一种实现。下面是一个具体的例子:JdbcTemplate中的execute方法JdbcTemplate执行execute方法