zoukankan      html  css  js  c++  java
  • 编写BeanFactory

    /**
     * 一个创建Bean对象的工厂
     *
     * Bean:在计算机英语中,有可重用组件的含义。
     * JavaBean:用java语言编写的可重用组件。
     *      javabean >  实体类
     *
     *   它就是创建我们的service和dao对象的。
     *
     *   第一个:需要一个配置文件来配置我们的service和dao
     *           配置的内容:唯一标识=全限定类名(key=value)
     *   第二个:通过读取配置文件中配置的内容,反射创建对象
     *
     *   配置文件可以是xml也可以是properties
     */
    public  class  BeanFactory{
        //定义一个properties对象
        private static Properties properties;
        //定义一个Map,用于存放我们要创建的对象, 我们把它称之为容器, 创建一个存起来,这样创建的对象就成为了单实例对象
        private static Map<String,Object> beans;
    
        /**
         * 首先,static{}(静态代码块)在程序加载中static是先于构造方法加载的,并且只会加载一次。
         * 两外static块中只能使用static修饰的属性。
         * 程序中的static{}块只是为了加载properties文件信息,这个加载只会被加载一次。
         */
        //使用静态代码块为properties赋值
        static {
            try {
                //实例化对象
                //            properties  = new Properties ();
                //            //获取properties文件的流对象
                //InputStream inputStream=new FileInputStream ();//不能使用此方式,文件具体路径可能并不确定
                InputStream inputStream=BeanFactory.class.getClassLoader ().getResourceAsStream ("bean.properties");
                properties.load (inputStream);
                //实例化容器
                beans=new HashMap<String,Object> ();
                //取出配置文件中所有的Key
                //Enumeration keys=properties.keys ();
                Set keys=  properties.keySet ();
                //遍历
                for (Object obj: keys) {
                    //获取key
                    String key=(String)obj;
                    //根据key获取value
                    String beanPath=properties.getProperty (key);
                    try {
                        //反射创建对象
                        Object value=Class.forName (beanPath).newInstance ();
                        //把key和value存入容器之中
                        beans.put (key,value);
                    } catch (Exception e) {
                        e.printStackTrace ();
                    }
                }
            } catch (IOException e) {
               throw  new ExceptionInInitializerError ("初始化失败!");
            }
    
        }
    
        /**
         * 在getBean时实例化一个对象,每次调用getBean时都会实例化一个新的对象,多实例
         * 多例对象被创建多次,执行效率不如单例对象
         * @param beanName
         * @return
         */
        public static Object getBean(String beanName){
            //Object bean=null;
            //try {
            //    //beanPath : com.itheima.service.impl.AccountServiceImpl
            //    String beanPath=properties.getProperty (beanName);
            //    /**
            //     * Class.forName (beanPath).newInstance ();
            //     * newInstance () 每次都会调用默认构造函数创建对象
            //     */
            //    bean=Class.forName (beanPath).newInstance ();
            //} catch (Exception e) {
            //    e.printStackTrace ();
            //}
            //return  bean;
            return beans.get (beanName);
        }
    }
  • 相关阅读:
    Java中类与类的关系
    谈谈spring
    mybatis和hibernate的区别
    微信小程序文档解读(一)--api提供支持有哪些
    nodejs问题整理--fs.exists无法正确判断文件的问题
    微信小程序-多级联动
    react
    [微信小程序] 终于可以愉快的使用 async/await 啦
    [Node] 逃离回调地狱
    单例模式
  • 原文地址:https://www.cnblogs.com/mkl7/p/10676845.html
Copyright © 2011-2022 走看看