zoukankan      html  css  js  c++  java
  • MySpring-02.程序间耦合

    1 编写jdbc的工程代码用于分析程序的耦合

    public class JdbcDemo1 {
        public static void main(String[] args) throws  Exception{
            //1.注册驱动
    //        DriverManager.registerDriver(new com.mysql.jdbc.Driver());      --拿笔划重点: 这里独立性差!
            Class.forName("com.mysql.jdbc.Driver");                  -- "字符串" 不依赖于具体的驱动类 
                                                   写死了;
                                                 -- 做法:通过读取配置文件    --properties  
    //2.获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/eesy","root","1234"); //3.获取操作数据库的预处理对象 PreparedStatement pstm = conn.prepareStatement("select * from account"); //4.执行SQL,得到结果集 ResultSet rs = pstm.executeQuery(); //5.遍历结果集 while(rs.next()){ System.out.println(rs.getString("name")); } //6.释放资源 rs.close(); pstm.close(); conn.close(); } }

     2 编译期依赖

     DriverManager.registerDriver(new com.mysql.jdbc.Driver());      --拿笔划重点: 这里独立性差!
     Class.forName("com.mysql.jdbc.Driver");  
      

    3 程序的耦合和解耦的思路分析1

    
    

    4 曾经代码中的问题分析

    
    

    5 编写工厂类和配置文件

    6 工厂模式解耦

    public interface IAccountDao {
    
        /**
         * 模拟保存账户
         */
        void saveAccount();
    }
    /**
     * 账户的持久层实现类
     */
    public class AccountDaoImpl implements IAccountDao {
    
        public  void saveAccount(){
    
            System.out.println("保存了账户");
        }
    }
    /**
     * 账户业务层的接口
     */
    public interface IAccountService {
    
        /**
         * 模拟保存账户
         */
        void saveAccount();
    }
    /**
     * 账户的业务层实现类
     */
    public class AccountServiceImpl implements IAccountService {
    
    //    private IAccountDao accountDao = new AccountDaoImpl();
    
        private IAccountDao accountDao = (IAccountDao)BeanFactory.getBean("accountDao");
    
    //    private int i = 1;
    
        public void  saveAccount(){
            int i = 1;
            accountDao.saveAccount();
            System.out.println(i);
            i++;
        }
    }
    /**
     * 一个创建Bean对象的工厂
     *
     * Bean:在计算机英语中,有可重用组件的含义。
     * JavaBean:用java语言编写的可重用组件。
     *      javabean >  实体类
     *
     *   它就是创建我们的service和dao对象的。
     *
     *   第一个:需要一个配置文件来配置我们的service和dao
     *           配置的内容:唯一标识=全限定类名(key=value)
     *   第二个:通过读取配置文件中配置的内容,反射创建对象
     *
     *   我的配置文件可以是xml也可以是properties
     */
    public class BeanFactory {
        //定义一个Properties对象
        private static Properties props;
    
        //定义一个Map,用于存放我们要创建的对象。我们把它称之为容器
        private static Map<String,Object> beans;
    
        //使用静态代码块为Properties对象赋值
        static {
            try {
                //实例化对象
                props = new Properties();
                //获取properties文件的流对象
                InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
                props.load(in);
                //实例化容器
                beans = new HashMap<String,Object>();
                //取出配置文件中所有的Key
                Enumeration keys = props.keys();
                //遍历枚举
                while (keys.hasMoreElements()){
                    //取出每个Key
                    String key = keys.nextElement().toString();
                    //根据key获取value
                    String beanPath = props.getProperty(key);
                    //反射创建对象
                    Object value = Class.forName(beanPath).newInstance();
                    //把key和value存入容器中
                    beans.put(key,value);
                }
            }catch(Exception e){
                throw new ExceptionInInitializerError("初始化properties失败!");
            }
        }
    
        /**
         * 根据bean的名称获取对象
         * @param beanName
         * @return
         */
        public static Object getBean(String beanName){
            return beans.get(beanName);
        }
    
        /**
         * 根据Bean的名称获取bean对象
         * @param beanName
         * @return
    
        public static Object getBean(String beanName){
            Object bean = null;
            try {
                String beanPath = props.getProperty(beanName);
    //            System.out.println(beanPath);
                bean = Class.forName(beanPath).newInstance();//每次都会调用默认构造函数创建对象
            }catch (Exception e){
                e.printStackTrace();
            }
            return bean;
        }*/
    }
    /**
     * 模拟一个表现层,用于调用业务层
     */
    public class Client {
    
        public static void main(String[] args) {
            //IAccountService as = new AccountServiceImpl();
            for(int i=0;i<5;i++) {
                IAccountService as = (IAccountService) BeanFactory.getBean("accountService");
                System.out.println(as);
                as.saveAccount();
            }
    
        }
    }

    properties-配置文件

    accountService=com.itheima.service.impl.AccountServiceImpl
    accountDao=com.itheima.dao.impl.AccountDaoImpl
    配置的内容:唯一标识=全限定类名(key=value)

     

    总结:

    耦合:程序间的依赖关系
     包括:
      类之间的依赖
      方法间的依赖


     解耦:
     降低程序间的依赖关系

     实际开发中:
     应该做到:编译期不依赖,运行时才依赖。


     <解耦的思路分析:>


    (1)第一步:使用反射来创建对象,而避免使用new关键字。
     (2)第二步:通过读取配置文件来获取要创建的对象全限定类名

  • 相关阅读:
    nginx搭建https服务器
    linux重新安装grub2
    docker使用笔记
    开户vim编程之--cscope支持
    mac代码自动补全git上
    python常用函数大总结
    服务器管理模块信息收集
    Virtual Data Optimizer虚拟存储优化器实战
    虚拟化-SDDC软件定义数据中心
    富士通 DX90 S2存储分配映射盘
  • 原文地址:https://www.cnblogs.com/ren549047861/p/11298432.html
Copyright © 2011-2022 走看看