模拟spring底层,工厂模式解耦

该博客介绍了如何使用工厂模式来模拟Spring框架底层的解耦机制。通过创建一个BeanFactory,实现了从配置文件加载DAO、Service的实现类,并在Servlet中通过工厂获取实例,调用相应方法。这种方式简化了组件之间的依赖,增强了系统的可维护性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模拟spring底层,工厂模式解耦

DAO层

package com.guoy.factory.dao;

/**
 * @author ShuaiGUO
 */
public interface TestDao {

    /**
     * 查找数据的方法
     */
    void findData();

}

package com.guoy.factory.dao;


/**
 * @author ShuaiGUO
 */
public class TestDaoImpl implements TestDao {


    @Override
    public void findData() {

        System.out.println("成功查找出来了数据");

    }
}

Service层

package com.guoy.factory.service;

/**
 * @author ShuaiGUO
 */
public interface TestService {

    /**
     * 查找数据的方法
     */
    void findData();

}

package com.guoy.factory.service;

import com.guoy.factory.BeanFactory;
import com.guoy.factory.dao.TestDao;

/**
 * @author ShuaiGUO
 */
public class TestServiceImpl implements TestService {

    @Override
    public void findData() {

        ((TestDao) BeanFactory.getBean("testDao")).findData();



    }
}

Servlet

package com.guoy.factory.servlet;

import com.guoy.factory.service.TestService;
import com.guoy.factory.BeanFactory;
/**
 * @author ShuaiGUO
 */
public class TestServlet {


    public void findData(){

        ((TestService) BeanFactory.getBean("testService")).findData();

    }


}

BeanFactory

package com.guoy.factory;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;

/**
 * 模拟spring底层,工厂模式解耦
 * @author ShuaiGUO
 */
public class BeanFactory {

    //用于存放组建的实例
    private static Map<String,Object> map;

    //Properties也是map集合对象    配合流对象读取配置文件
    private static Properties properties;


    /**
     * 将添加组件的过程放在静态代码块中,保证组件是单例的
     */
    static {

        //初始化map集合的实例
        map = new HashMap<>();

        //初始化properties的实例
        properties = new Properties();

        try {

            //创建流对象
            FileReader fileReader = new FileReader("beans.properties");

            //读取配置文件中的数据,装载进集合
            properties.load(fileReader);


        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();
        }


        //获取配置文件中所有的key
        Enumeration<Object> keys = properties.keys();

        /**
         *遍历所有的key
         * keys.hasMoreElements判断是否存在下个数据
         */
        while (keys.hasMoreElements()){

            //获取所有key的object
            Object obj = keys.nextElement();

            //转换为string类型
            String key = obj.toString();

            //根据key获取value,返回的是value,也就是我们想要的className
            String className = properties.getProperty(key);


            try {
                //根据反射创建字节码对象
                Class aClass = Class.forName(className);

                //创建实例对象
                Object object = aClass.newInstance();

                //将创建出来的实例,添加到map集合中
                map.put(key,object);



            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }


        }



    }

    /**
     * 根据全局表示,获取实例
     * @param className 全局表示
     * @return
     */
    public static Object getBean(String className){


        //从map集合中获取实例
        return map.get(className);
    }


}

beans.propertoies

testDao = com.guoy.factory.dao.TestDaoImpl
testService = com.guoy.factory.service.TestServiceImpl
testServlet = com.guoy.factory.servlet.TestServlet

Test

package com.guoy.factory;

import com.guoy.factory.servlet.TestServlet;

public class Test {

    public static void main(String[] args) {

        //从工厂中获取表现层的实例
        TestServlet testServlet = (TestServlet) BeanFactory.getBean("testServlet");

        testServlet.findData();


    }

}

输出结果:

成功查找出来了数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值