zoukankan      html  css  js  c++  java
  • spring自定义bean工厂模式解耦

    在resources下创建bean.properties

    accountService=cn.flypig666.service.impl.AccountServiceImpl
    accountDao=cn.flypig666.dao.impl.AccountDaoImpl

    创建工厂:BeanFactory.java

    创建单例对象效果更好

    创建Map<String,Object>类型的容器beans

     1 //定义一个Properties对象
     2     private static Properties props;
     3 
     4     //定义一个Map,用于存放我们要创建的对象,称之为容器
     5     private static Map<String,Object> beans;
     6 
     7     //使用静态代码块为Properties对象赋值
     8     static {
     9         try {
    10             //实例化对象
    11             props = new Properties();
    12             //获取properties文件的流对象,创建在resources文件夹下的properties文件会成为类根路径下的文件,不用写包名
    13             InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
    14             props.load(in);
    15             //实例化容器
    16             beans = new HashMap<String, Object>();
    17             //取出配置文件中所有的 Key
    18             Enumeration  keys = props.keys();
    19             //遍历枚举
    20             while (keys.hasMoreElements()){
    21                 //取出每个key
    22                 String key = keys.nextElement().toString();
    23                 //根据key获取value
    24                 String beanPath = props.getProperty(key);
    25                 //反射创建对象
    26                 Object value = Class.forName(beanPath).newInstance();
    27                 //把key和value存入容器中
    28                 beans.put(key,value);
    29             }
    30         } catch (Exception e) {
    31             throw new ExceptionInInitializerError("初始化properties失败");
    32         }
    33     }
    34 
    35     public static Object getBean(String beanName){
    36         return beans.get(beanName);
    37     }
     1     /**
     2      * 根据Bean的名称获取bean对象
     3      * @param beanName
     4      * @return
     5      */
     6     public static Object getBean(String beanName){
     7         Object bean = null;
     8         try{
     9             String beanPath = props.getProperty(beanName);
    10             System.out.println(beanPath);
    11             bean = Class.forName(beanPath).newInstance();
    12         }catch (Exception e){
    13             e.printStackTrace();
    14         }
    15         return bean;
    16     }
    17 
    18 }

    通过反射获取对象

    /**
     * 账户业务层实现类
     */
    public class AccountServiceImpl implements IAccountService {
    
        //private IAccountDao accountDao = new AccountDaoImpl();
        private IAccountDao accountDao = (IAccountDao) BeanFactory.getBean("accountDao");
    
        public void saveAccount(){
            accountDao.saveAccount();
        }
    }
    /**
     * 模拟一个表现层,用于调用业务层
     */
    public class Client {
    
        public static void main(String[] args) {
    //        IAccountService accountService = new AccountServiceImpl();
            IAccountService accountService = (IAccountService) BeanFactory.getBean("accountService");
            accountService.saveAccount();
        }
    }
  • 相关阅读:
    数组构建完全二叉树
    [.net core学习] .net core中的MD5CryptoServiceProvider取代方法
    [.net core学习] .net core中的MD5CryptoServiceProvider取代方法
    [.net core学习] .net core中的MD5CryptoServiceProvider取代方法
    [.net core学习] .net core中的MD5CryptoServiceProvider取代方法
    交互式访问数据库
    Jackson /常用注解/ annotation
    vue图表组件使用,组件文档echarts
    java8 Optional 容器类
    java8 : Lambda 方法引用
  • 原文地址:https://www.cnblogs.com/flypig666/p/11510970.html
Copyright © 2011-2022 走看看