`
ahut9923
  • 浏览: 239007 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

结合Spring实现设计模式与面向接口编程(不断更新中...)

阅读更多

在学设计模式的时候,遇到的一个比较大的问题就是,虽然设计模式可以解决很多的重用性、解耦和的问题,但是最后在类之间建立关系的时候,还是需要显示的编写代码,在代码修改的时候,还是需要修改比较大量的代码,现在结合Spring,设计好类结构以后,就可以进行容器外类依赖注入,这是非常好的思想,不仅在更深程度实现了解耦和,同时让程序员更关注业务,而不是实现,真正实现面向接口的编程,可以说,纯设计模式是将类关系延迟到子类,而在Spring中,我认为类关系延迟到了容器外,或者直接说延迟到了XML文件中(不仅仅是XML配置文件,还有注解),通过简单的配置文件修改,就可以修改程序整个的类依赖关系.在我们实际开发过程中,我们完全可以设计好接口的结构,完全不用管实现类,在接口设计合理后,再进行实现,那么只需要添加配置文件的内容就可以实现程序的运转

 

工厂模式:

我们很了解这个模式,对于面向接口编程的思想,我们只需要定义接口,然后利用Spring进行装配,实现结束以后,再将实现类的类名写入配置文件中去。

工厂模式类图

 

 

 

              applicationContext.xml文件结构图


 

 

客户端使用代码:

                                                      view plaincopy to clipboardprint?
package org.ys.spring.factory;  
 
   
 
import org.springframework.context.ApplicationContext;  
 
import org.springframework.context.support.ClassPathXmlApplicationContext;  
 
   
 
public class Test {  
 
   
 
    public static void main(String[] args) {  
 
       ApplicationContext cs = new ClassPathXmlApplicationContext(  
 
              "applicationContext.xml");  
 
       IFactory bean = (IFactory) cs.getBean("factory");  
 
       bean.createProduct().operation();  
 
    }  
 

package org.ys.spring.factory;

 

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

public class Test {

 

    public static void main(String[] args) {

       ApplicationContext cs = new ClassPathXmlApplicationContext(

              "applicationContext.xml");

       IFactory bean = (IFactory) cs.getBean("factory");

       bean.createProduct().operation();

    }

}
 

 

如果我们需要更改工厂或者产品,我们就可以在配置文件,将红色线内的字符串进行修改就可以,完全不用修改任何代码,

 

 

单例模式:

在默认的情况下,Spring中的bean都是单例模式,只是这个单例,不是通过代码限制,而是通过Spring容器限制,也就是说如果你想通过Spring获得对象时,这个对象是单例的。

 

 结构型模式中的组合模式

类图:

 

 相信大家也都很熟悉这个设计模式,applicationContext.xml文件结构图:

 

代码如下:

                       view plaincopy to clipboardprint?
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> 
    <bean id="factory" 
        class="org.ys.spring.composite.impl.TreeFactory"> 
    </bean> 
    <bean id="component" class="org.ys.spring.composite.IComponent" 
        factory-bean="factory" abstract="true"> 
    </bean> 
    <bean id="rootnode" 
        class="org.ys.spring.composite.impl.Component"> 
        <property name="list"> 
            <list value-type="org.ys.spring.composite.IComponent"> 
                <bean class="org.ys.spring.composite.impl.Component"></bean> 
                <bean class="org.ys.spring.composite.impl.Leaf"></bean> 
            </list> 
        </property> 
    </bean> 
</beans> 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
 <bean id="factory"
  class="org.ys.spring.composite.impl.TreeFactory">
 </bean>
 <bean id="component" class="org.ys.spring.composite.IComponent"
  factory-bean="factory" abstract="true">
 </bean>
 <bean id="rootnode"
  class="org.ys.spring.composite.impl.Component">
  <property name="list">
   <list value-type="org.ys.spring.composite.IComponent">
    <bean class="org.ys.spring.composite.impl.Component"></bean>
    <bean class="org.ys.spring.composite.impl.Leaf"></bean>
   </list>
  </property>
 </bean>
</beans>

 

类代码如下:

IComponent:

                  view plaincopy to clipboardprint?
package org.ys.spring.composite;  
 
import java.util.List;  
 
/** 
 *  
 * @author T-Bag.& 
 * 
 */ 
public interface IComponent {  
 
    public void operation();  
 
    public List<IComponent> getChildren();  

package org.ys.spring.composite;

import java.util.List;

/**
 *
 * @author T-Bag.&
 *
 */
public interface IComponent {

 public void operation();

 public List<IComponent> getChildren();
}
 

ITreeFactory:

                 view plaincopy to clipboardprint?
package org.ys.spring.composite;  
 
/** 
 *  
 * @author T-Bag.& 
 *  
 */ 
public interface ITreeFactory {  
 
    public IComponent getTreeRoot();  

package org.ys.spring.composite;

/**
 *
 * @author T-Bag.&
 *
 */
public interface ITreeFactory {

 public IComponent getTreeRoot();
}
 

Component:

                view plaincopy to clipboardprint?
package org.ys.spring.composite.impl;  
 
import java.util.List;  
 
import org.ys.spring.composite.IComponent;  
 
/** 
 *  
 * @author T-Bag.& 
 *  
 */ 
public class Component implements IComponent {  
 
    List<IComponent> list = null;  
 
    public void setList(List<IComponent> l) {  
        this.list = l;  
    }  
 
    public List<IComponent> getChildren() {  
        return list;  
    }  
 
    public void operation() {  
 
    }  

package org.ys.spring.composite.impl;

import java.util.List;

import org.ys.spring.composite.IComponent;

/**
 *
 * @author T-Bag.&
 *
 */
public class Component implements IComponent {

 List<IComponent> list = null;

 public void setList(List<IComponent> l) {
  this.list = l;
 }

 public List<IComponent> getChildren() {
  return list;
 }

 public void operation() {

 }
}
 

Leaf:

                 view plaincopy to clipboardprint?
package org.ys.spring.composite.impl;  
 
import java.util.List;  
 
import org.ys.spring.composite.IComponent;  
 
/** 
 *  
 * @author T-Bag.& 
 *  
 */ 
public class Leaf implements IComponent {  
 
    public List<IComponent> getChildren() {  
        return null;  
    }  
 
    public void operation() {  
        System.out.println("i am leaf");  
    }  

package org.ys.spring.composite.impl;

import java.util.List;

import org.ys.spring.composite.IComponent;

/**
 *
 * @author T-Bag.&
 *
 */
public class Leaf implements IComponent {

 public List<IComponent> getChildren() {
  return null;
 }

 public void operation() {
  System.out.println("i am leaf");
 }
}
 

TreeFactory:

                view plaincopy to clipboardprint?
package org.ys.spring.composite.impl;  
 
import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
import org.ys.spring.composite.IComponent;  
import org.ys.spring.composite.ITreeFactory;  
 
/** 
 *  
 * @author T-Bag.& 
 *  
 */ 
public class TreeFactory implements ITreeFactory {  
 
    public IComponent getTreeRoot() {  
        ApplicationContext cs = new ClassPathXmlApplicationContext(  
                "applicationContext.xml");  
        return (IComponent) cs.getBean("rootnode");  
    }  

package org.ys.spring.composite.impl;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.ys.spring.composite.IComponent;
import org.ys.spring.composite.ITreeFactory;

/**
 *
 * @author T-Bag.&
 *
 */
public class TreeFactory implements ITreeFactory {

 public IComponent getTreeRoot() {
  ApplicationContext cs = new ClassPathXmlApplicationContext(
    "applicationContext.xml");
  return (IComponent) cs.getBean("rootnode");
 }
}
 

Test:

                 view plaincopy to clipboardprint?
package org.ys.spring.composite;  
 
import java.util.List;  
 
import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
 
public class Test {  
 
    public static void main(String[] args) {  
        ApplicationContext cs = new ClassPathXmlApplicationContext(  
                "applicationContext.xml");  
        ITreeFactory f = (ITreeFactory) cs.getBean("factory");  
        IComponent treeRoot = f.getTreeRoot();  
        List<IComponent> children = treeRoot.getChildren();  
        System.out.println(children == null ? false : true);  
        if (children != null) {  
            for (IComponent i : children) {  
                i.operation();  
            }  
        }  
    }  

package org.ys.spring.composite;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

 public static void main(String[] args) {
  ApplicationContext cs = new ClassPathXmlApplicationContext(
    "applicationContext.xml");
  ITreeFactory f = (ITreeFactory) cs.getBean("factory");
  IComponent treeRoot = f.getTreeRoot();
  List<IComponent> children = treeRoot.getChildren();
  System.out.println(children == null ? false : true);
  if (children != null) {
   for (IComponent i : children) {
    i.operation();
   }
  }
 }
}
 

执行结果:

               view plaincopy to clipboardprint?
true 
i am leaf 
true
i am leaf

桥接模式:

看过《精通Spring Java 轻量级架构开发实践》的人,可能会知道,里面有一个利用桥接设计模式设计的一个邮件发送的例子,虽然它没有直接说用什么设计模式,但是我画了一张类图,大家从这里也可以看出,不仅可以看出使用了桥接设计模式,也可以看出使用Spring的好处。

 

 

 

大家可以看到这是典型的桥接设计模式,更重要的是,结合这种设计模式和Spring,客户端只需要和Spring打交道,不了解具体的实现类,而且可以通过配置文件的修改,改变具体的实现类,而不用手动注入


本想将所有的设计模式使用Spring实现一遍,但发现这些设计模式都有共通点,我就介绍了几种,其他的也都是一样的设计。只需要记住,面向接口、松耦合、依赖注入.

 

下面这个是最基本的一些Spring配置,保留下来,以后用到Spring就可以省去一些必要的配置,方便我们编程,将配置的时候省去

view plaincopy to clipboardprint?
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
    xmlns:context="http://www.springframework.org/schema/context
    xmlns:aop="http://www.springframework.org/schema/aop
    xmlns:tx="http://www.springframework.org/schema/tx
    xsi:schemaLocation="  
    http://www.springframework.org/schema/beans   
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
    http://www.springframework.org/schema/context   
    http://www.springframework.org/schema/context/spring-context-2.5.xsd  
    http://www.springframework.org/schema/aop  
    http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
    http://www.springframework.org/schema/tx  
    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 
 
    <!-- tx: Spring注解的事务 --> 
    <!-- context: Spring注解的依赖注入 --> 
    <!-- aop: Spring注解的AOP --> 
 
    <context:annotation-config /> 
    <!-- 使用注解的方式实现依赖注入 --> 
    <!-- @Resource(name="")在字段上或者在set方法上 --> 
    <aop:aspectj-autoproxy /> 
    <!-- 使用注解的方式实现AOP编程 --> 
    <!-- 切面(类上): @Aspect --> 
    <!-- 切点(方法上): @Pointout(execution(* package..*.*(..))) public void anyMethod(){} --> 
    <!-- 通知(方法上): @Before("anyMethod") 代表在anyMethod这个切入点的前置通知--> 
    <!-- 将切面交给Spring --> 
    <bean id="aspectId" class="aspect class name"></bean> 
    <bean id="businessBean" class="business class name"></bean> 
    <!-- 然后用Spring获得这个businessBean,那么就可以了 --> 
 
    <!-- 使用XML方式实现依赖注入和AOP编程 --> 
 
    <!-- 提供一个类作为切面 --> 
    <bean id="aspectId2" class="aspect class name" /> 
    <!-- 进行AOP配置 --> 
    <aop:config> 
        <aop:aspect id="aspectI" ref="aspectId2"> 
            <aop:pointcut id="pointout" 
                expression="execution(* package..*.*(..))" /> 
            <aop:before method="切面类中的方法" pointcut-ref="pointout" /> 
            <aop:after-throwing method="抛出异常后执行" 
                pointcut-ref="pointout" /> 
        </aop:aspect> 
    </aop:config> 
 
    <!-- 使用XML进行依赖注入 --> 
    <bean id="factory" 
        class="org.ys.spring.composite.impl.TreeFactory"> 
    </bean> 
    <bean id="component" class="org.ys.spring.composite.IComponent" 
        factory-bean="factory" abstract="true" factory-method="getTreeRoot"> 
    </bean> 
    <bean id="rootnode" 
        class="org.ys.spring.composite.impl.Component"> 
        <property name="list"> 
            <list value-type="org.ys.spring.composite.IComponent"> 
                <bean class="org.ys.spring.composite.impl.Component"></bean> 
                <bean class="org.ys.spring.composite.impl.Leaf"></bean> 
            </list> 
        </property> 
    </bean> 
 
    <!-- Spring结合JDBC --> 
    <!-- 基于XML方法 --> 
    <bean id="dataSource" 
        class="org.apache.commons.dbcp.BasicDataSource" 
        destroy-method="close"> 
        <property name="driverClassName" value="驱动的包名加类名"></property> 
        <property name="url" 
            value="jdbc:mysql://localhost:8080/databaseName"> 
        </property> 
        <property name="username" value="root"></property> 
        <property name="password" value="***"></property> 
        <property name="initialSize" value="10"></property> 
        <property name="maxActive" value="100"></property> 
        <property name="maxIdle" value="20"></property><!-- 现在有500个空闲,释放连接的数,最多剩下20个 --> 
        <property name="minIdle" value="1"></property><!-- 最少链接的数,就算再少,也要有1个 --> 
    </bean> 
    <!-- Spring事务管理器 --> 
    <bean id="txManager" 
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
        <property name="dataSource" ref="dataSource"></property> 
    </bean> 
 
    <!-- Spring与JDBC使用注解 --> 
    <tx:annotation-driven transaction-manager="txManager" /> 
    <!-- 接下来就可以进行进行数据库的增删改查的操作了,将DAO的实现类交给Spring --> 
    <bean id="dao" class="dao class impl name"> 
        <property name="dataSource" ref="dataSource"></property> 
        <!-- 在dao实现类中,对DataSource变量进行注入 --> 
    </bean> 
    <!-- 然后就可以使用JdbcTemplate进行JDBC操作  
        JdbcTemplate template = new JdbcTemplate(dataSource);  
        //保存  
        template.update("insert into person values(?, ?)", new Object[]{1, "name"}, new int[]{java.sql.Types.INT, java.sql.Types.VARCHAR});  
        template.update("update person set name=? ", new Object[]{"name"}, new int[]{java.sql.Types.VARCHAR});  
        //查找  
        Object o = template.queryForObject("select * from person where id= ?", new Object[]{2}, new int[]{java.sql.Types.INT}, new RowMapper(){  
                public Object mapRow(ResultSet set, int index) {  
                    Person p = new Person();  
                    从set中取得信息放入p  
                    return p;  
                }  
            }  
        );  
        queryForObject返回一个对象  
        query返回多个对象,实际上返回List对象  
        queryFor...返回对应类型  
          
        如果没有事务管理器,那么方法中的每条语句都会在自身的事务中执行,所以在类上加上  
        @Transactional  
        那么在每个方法都是事务级的  
但是当需要在某个具体的方法上加上注解的时候,则涉及到事务的一些属性  
比如在方法上加上@Transactional(readonly=true,rollBackFor=Exception.class, propagation=Propagation.NOT_SUPPORT,isolation=Isolation.READ_COMMITTED)  
其中:readonly代表这个事务方法是只读的,不会插入修改,对于这样的方法,设置为true可以提高效率  
rollBackFor代表回滚原因,这里代表异常是Exception的回滚  
propagation代表事务传播方式,个人认为其主要关注点在于嵌套事务的处理方法。  
isolation就是代表事务的隔离级别  
 
 
 
    --> 
</beans>


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/neusoftware_20063500/archive/2009/04/18/4090299.aspx

分享到:
评论

相关推荐

    Spring_依赖注入_面向接口编程_不同加载方式

    本项目以"Spring_依赖注入_面向接口编程_不同加载方式"为主题,旨在帮助初学者理解Spring的核心特性——依赖注入(Dependency Injection,简称DI),以及如何通过面向接口编程来提高代码的可维护性和可扩展性。...

    Spring_依赖注入_面向接口编程

    在Spring框架中,面向接口编程与依赖注入相结合,使得我们可以编写更加灵活、可扩展的代码。例如,我们可以定义一个服务接口,然后创建多个实现这个接口的类。在Spring配置文件中,我们可以指定使用哪个实现类,并...

    面向接口编程

    面向接口编程是软件设计中的一个重要概念,它倡导的是在代码中使用接口而非具体的实现类来进行交互。这种编程方式能够提高代码的灵活性、可扩展性和可维护性,是面向对象编程中的核心原则之一。在Java、C#等面向对象...

    spring简单模拟(面向抽象/接口编程)

    在IT行业中,面向抽象或接口编程是一种非常重要的设计原则,它强调了程序设计时应将具体实现细节与高层逻辑解耦。Spring框架是Java领域中广泛使用的轻量级框架,它充分利用了面向抽象编程的优势,提供了强大的依赖...

    Spring框架的设计理念与设计模式分析

    2. **面向接口编程**:Spring鼓励面向接口编程,而不是面向具体实现编程,这有助于提高代码的可复用性和可测试性。 3. **非侵入式**:Spring不强制要求特定的类结构或继承层次,因此它可以轻松集成到现有的项目中...

    Spring框架的设计理念与设计模式分析.pdf

    3. **面向接口编程**:Spring 鼓励面向接口编程,有助于实现更好的代码抽象和解耦。 4. **松耦合设计**:通过依赖注入和其他机制,Spring 支持松耦合的设计原则,提高了系统的灵活性和可扩展性。 总之,Spring 框架...

    第四章:Spring AOP API 设计模式1

    【Spring AOP设计模式】是Spring框架中面向切面编程的重要组成部分,它允许开发者通过分离关注点来解耦代码,实现灵活的模块化设计。在本章中,我们将探讨17种设计模式在Spring AOP中的应用和实现,以及它们如何帮助...

    Spring3.X编程技术与应用.(丁振凡)

    根据给定的信息,“Spring3.X编程技术与应用”这一标题及描述主要聚焦于Spring框架的3.x版本在软件开发中的具体应用与技术要点。Spring框架是Java领域内一个非常流行的开源框架,它提供了全面的基础架构支持,使得...

    Spring框架的设计理念与设计模式分析之一

    ### Spring框架的设计理念与设计模式分析 #### 一、Spring框架概述 Spring作为一个现代软件开发领域内备受推崇的框架,其强大的功能与灵活性使得它在众多框架中脱颖而出。本文旨在深入探讨Spring框架的设计理念...

    Spring框架的设计原理及设计模式分析

    Spring 框架的设计原理及设计模式分析 Spring 框架的设计原理是基于面向 Bean 的编程(BOP,Bean Oriented Programming),它的核心组件只有三个:Core、Context 和 Beans。这些组件之间的协同工作是 Spring 框架的...

    Spring_框架的设计理念与设计模式分析

    首先,它强调了松耦合的重要性,通过依赖注入和面向接口编程等技术手段实现了对象间的低耦合度。其次,Spring展示了如何通过抽象和封装来提高代码的可维护性和可扩展性。最后,Spring框架的设计也体现了“不要重复...

    Spring 框架的设计理念与设计模式分析

    2. **面向接口编程**:Spring鼓励开发者遵循面向接口编程的原则,这有助于提高代码的灵活性和可维护性。 3. **分离关注点**:Spring通过分层设计和模块化实现分离关注点的原则,使得不同层面的功能可以独立开发和...

    Spring框架的设计理念和设计模式分析

    Spring框架的设计和实现中广泛运用了多种设计模式,包括但不限于: - **工厂模式:** BeanFactory就是工厂模式的应用,负责创建和管理Bean。 - **代理模式:** 在AOP的实现中,Spring使用了JDK动态代理或CGLIB动态...

    Mybatis面向接口编程1

    在 Mybatis 中,面向接口编程是一种重要的设计模式,它旨在提高代码的可读性和可维护性。下面我们将详细探讨 Mybatis 面向接口编程的核心概念及其在实际应用中的作用。 首先,我们来看一下 Mybatis 面向接口编程的...

    多图详解Spring框架的设计理念与设计模式

    ### Spring框架的设计理念与设计模式解析 #### 一、Spring框架的发展历程与背景 Spring框架是由Rod Johnson在2002年开始开发的,最初源于他对Java EE标准框架中存在问题的深刻反思。Rod Johnson在其著作《Expert ...

    面向接口的编程

    在实际应用中,面向接口编程常常与依赖注入(Dependency Injection)和多态性等概念结合使用,以实现更高级别的解耦和复用。例如,Spring框架就广泛使用了接口和依赖注入,使得Java应用可以灵活地管理对象和服务。 ...

Global site tag (gtag.js) - Google Analytics