手写bean工厂 - properties

本文介绍了一个简单的Bean工厂实现过程,包括配置文件定义、类加载、对象创建及MVC模式下的应用示例。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

1、写配置文件panda.properties

tip:Properties 底层是map,key-value形式存值

pandaService=com.panda.service.impl.PandaServiceImpl
pandaDao=com.panda.dao.impl.PandaDaoImpl
pandaController=com.panda.controller.PandaController

2、bean工厂初始化读取配置文件加载类放到map

//解析配置文件
    static Map<String,String> mapping = new HashMap<>();
    //静态初始化
    static{
            //得到文件流
        InputStream is = BeanFactory.class.getResourceAsStream("/com/resource/panda.properties");
            //读取
        Properties properties = new Properties();
        try {
            //  加载类到properties
            properties.load(is);
            //遍历 放到mapping
            for(Map.Entry entry :properties.entrySet()){
                mapping.put(entry.getKey().toString(),entry.getValue().toString());
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("读取配置文件,加载类异常。。");
        }

    }

3、写工厂创建对象方法

//方法四 通过全限定名反射获取对象
    public static<T> T getBean3(String key){
         T t = null;
         try {
             //map  - 取全路径
             String path = mapping.get(key);
             Class<?> forName = Class.forName(path);
             t = (T)forName.newInstance();
         }catch (Exception e){
             e.printStackTrace();
         }
        return t;
    }

4、工厂准备完毕,开始测试
one、准备mvc模式的包、类
在这里插入图片描述
two 、源码:

entity: Pandaa.java

package com.panda.entity;

public class Pandaa {
    public Integer id;
    public String name;
    public String address;
    public Pandaa(Integer id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }
    public void setId(Integer id){
        this.id = id;
    }
    public Integer getId(){
        return id;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setAddress(String address){
        this.address = address;
    }
    public String getAddress(){
        return address;
    }
}

dao 层:PandaDao 接口、PandaDaoImpl 实现

package com.panda.dao;
import  com.panda.entity.Pandaa;
public interface PandaDao {
    public Pandaa queryById(Integer id);

}
package com.panda.dao.impl;
import com.panda.dao.PandaDao;
import com.panda.entity.Pandaa;

public class PandaDaoImpl implements PandaDao {

    @Override
    public Pandaa queryById(Integer id) {
        Pandaa panda = null;
        switch (id){
            case 1:
                panda =  new Pandaa(1,"pandaa","地球");
                break;
            case 2:
                panda = new Pandaa(2,"pandab","月球");
                break;
            case 3:
                panda = new Pandaa(3,"pandac","火星");
                break;
            default:
                break;

        }
        return panda;
    }
}


service层:PandaService接口、PandaServiceImpl 实现

package com.panda.service;

import com.panda.entity.Pandaa;

public interface  PandaService {
    public Pandaa queryById(Integer id);
}
package com.panda.service.impl;

import com.panda.dao.PandaDao;
import com.panda.dao.impl.PandaDaoImpl;
import com.panda.entity.Pandaa;
import com.panda.factory.BeanFactory;
import com.panda.service.PandaService;

public class PandaServiceImpl implements PandaService{
    //private PandaDaoImpl pandaDao = BeanFactory.getBean(PandaDaoImpl.class);
    //private PandaDaoImpl pandaDao = BeanFactory.getBean2("com.panda.dao.impl.PandaDaoImpl");
    private PandaDaoImpl pandaDao= BeanFactory.getBean3("pandaDao");
    @Override
    public Pandaa queryById(Integer id) {
        return pandaDao.queryById(id);
    }
}

controller层:PandaController

package com.panda.controller;

import com.panda.entity.Pandaa;
import com.panda.factory.BeanFactory;
import com.panda.factory.PandaFactory;
import com.panda.service.PandaService;
import com.panda.service.impl.PandaServiceImpl;

public class PandaController {
    //private PandaService pandaService = PandaFactory.getPandaService();
    /*private PandaService pandaService;
    {
        // pandaService = BeanFactory.getBean(PandaService.class);
        pandaService = BeanFactory.getBean2("com.panda.service.impl.PandaServiceImpl");
    }*/
private PandaService pandaService = BeanFactory.getBean3("pandaService");
    public void queryById(){
        int id = 1;
        Pandaa pandaa = pandaService.queryById(id);
        System.out.println("恭喜你。。"+pandaa.getName());
    }
}

5、单元测试

package com.panda.test;

import com.panda.controller.PandaController;
import com.panda.factory.BeanFactory;
import com.panda.factory.PandaFactory;

public class TestPanda {
    public static void main(String[] args) {
        //PandaController pandaController = PandaFactory.getPandaController();
        PandaController pandaController = null;
        //pandaController = BeanFactory.getBean(PandaController.class);
        //pandaController = BeanFactory.getBean2("com.panda.controller.PandaController");
        //通过key获取controller对象
        pandaController = BeanFactory.getBean3("pandaController");
        //调controller中方法
        pandaController.queryById();
    }
}

6、结果
在这里插入图片描述

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值