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();
    }
}

原文地址:https://www.cnblogs.com/flypig666/p/11510970.html

时间: 2024-11-15 00:36:19

spring自定义bean工厂模式解耦的相关文章

从基础知识到重写Spring的Bean工厂中学习java的工厂模式

1.静态工厂模式其他对象不能直接通过new得到某个类,而是通过调用getInstance()方法得到该类的对象这样,就可以控制类的产生过程.顺带提一下单例模式和多例模式:  单例模式是指控制其他对象获得该对象永远只有同一个对象  而多例模式则是根据需要从某个具体集合中获取所需的对象 1 import java.util.ArrayList; 2 import java.util.List; 3 4 5 public class Car implements Moveable{ 6 private

理解Spring的Bean工厂

一提到工厂,我们先来回忆前面学习过的工厂方法和抽象工厂模式: 工厂方法:针对产品维度,可以产生新的产品,也可以产生新的产品工厂,既可以扩展产品维度.但是如果我们想在普通工厂上生产产品系列,就会特别麻烦如果产生Apple你就得产生AppleFactory,如果产生Mushroom,就得产生MushroomFactory.这样就会照成工厂泛滥. 抽象工厂:针对产品系列,可以在谋一系列的产品上进行扩展.缺点是如果产生产品新种,改动就会很多. Spring工厂:可以在产品系列方面既能扩展,又能确定产品品

Spring设计模式_工厂模式

先说下工厂模式的特性 1.对于调用者来说,影藏了复杂的逻辑处理过程,调用者只关心执行结果. 2.工厂要对结果负责,保证生产出符合规范的产品. Git代码地址  https://github.com/wujiachengSH/WjcFactoryDemo 下述的3个栗子分别为简单工厂,工厂方法,抽象工厂 先来个栗子看看什么是工厂把 首先是简单工厂模式 声明一个动物工厂 1 package com.wjc.Factory; 2 3 public interface Animal { 4 5 Stri

spring学习之工厂模式

1.设计模式是一套反复使用,多数人知晓,经过分类.代码设计的经验总结. 2.工厂模式的定义:为创建一组相关或者相互依赖的对象提供一个接口,而无需指定他们的具体实现类. 3.工厂模式的适用性 (1)有一组类似的对象需要创建; (2)系统需要考虑扩展性. 4.工厂模式的三个角色 (1)抽象产品(接口) (2)具体产品(实现类) (3)生产者(工厂类) 其中concreteProduct是具体产品,product是抽象产品,creator是生产者. 5.工厂模式的好处: 提供好的灵活性和代码复用性,代

Spring 自定义Bean 实例获取

一.通过指定配置文件获取, 对于Web程序而言,我们启动spring容器是通过在web.xml文件中配置,这样相当于加载了两次spring容器 ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("beanId"); 二.通过Spring提供的工具类获取ApplicationContext对象 ApplicationCont

工厂模式,简单工厂模式,抽象工厂模式

说到这几个工厂模式有很多相似之处又有不同.最重要的是掌握这种思想,在以后搭建项目架构或写一些功能,应用这些思想,让自己的程序更健壮,或者说当你看到别人写的程序应用到了这种思想能够快速理解.话不多说,咱们先从入门级的小案例讲起. 一.简单工厂模式 基本概念:简单工厂模式是由一个工厂类根据接受到的消息决定要创建哪一个类的对象实例. 优点:在客户端只需要告诉工厂类创建什么实例就行,而不要关注具体怎么创建,因为那个工厂类有相关逻辑. 缺点:当添加新产品就不得不修改工厂逻辑,当类型较多时,可能造成工厂逻辑

Spring中如何使用工厂模式实现程序解耦?

目录 1. 啥是耦合.解耦? 2. jdbc程序进行解耦 3.传统dao.service.controller的程序耦合性 4.使用工厂模式实现解耦 5.工厂模式改进 6.结语 @ 1. 啥是耦合.解耦? 既然是程序解耦,那我们必须要先知道啥是耦合,耦合简单来说就是程序的依赖关系,而依赖关系则主要包括 1. 类之间的依赖 2. 方法间的依赖 比如下面这段代码: public class A{ public int i; } public class B{ public void put(A a)

Spring 实现两种设计模式:工厂模式和单态模式

在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工厂模式可将Java 对象的调用者从被调用者的实现逻辑中分离出来,调用者只需关心被调用者必须满足的规则(接口) ,而不必关心实例的具体实现过程.这是面向接口编程的优势,能提高程序的解耦,避免所有的类以硬编码方式耦合在一起. 如果所有的类直接耦合,极易形成"骨牌效应",假如B 类调用了A 类,一旦A 类需要修改,则B 类也需要修改:假如C 类调用了B 类,则C 类也需要修改......依次类推,从而导致整个系统都需要改写

Spring工厂模式

普通工厂模式和抽象共产模式的优缺点:(1)普通工厂模式能够在单一产品维度上进行扩展,但是增加一个产品就要增加一个相应的工厂类,这样就会造成工厂的泛滥:(2)抽象工厂模式:很好的实现了一批产品的更新,但是,另一方面在单一产品维度上不好扩展. 而Spring的工厂模式原理是将Bean的信息放在配置文件当中.我们要模拟的话,可以用Java当中提供的一个特殊的类java.util.Properties,从而将类名信息在bean.properties文件中进行配置.将配置信息读取出来后,再利用反射技术进行