【Spring学习笔记】九、Factory反射解决对象之间耦合解决 通用工厂类设计

一、接上回分析

1、如果每次创建都需要使用第八节的创建方式。每次创建一个对象都要重新写一个方法,累赘。

package com.haoxiansheng.spring5.reflex;

import com.haoxiansheng.spring5.Book;
import com.haoxiansheng.spring5.Order;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @author haoxiansheng
 * @date 2020-06-03
 */
public class BeanFactory {
    private static Properties env = new Properties();

    static {
        try {
            // 第一步获得IO 输入流
            InputStream inputStream = BeanFactory.class.getResourceAsStream("/application.properties");
            // 第二部文件内容封装到Properties 集合 key = book value = com.haoxiansheng.spring5.Book
            env.load(inputStream);
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

//    public static Book getBook() {
//        Book book = null;
//        try {
//            // 硬编码 耦合
//            //Class clazz = Class.forName(env.getProperty("com.haoxiansheng.spring5.Book"));
//            // 利用配置文件加载的方式解决耦合
//            Class clazz = Class.forName(env.getProperty("book"));
//            book = (Book) clazz.newInstance();
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//        }
//        return book;
//    }
//
//    public static Order getOrder() {
//        Order order = null;
//        try {
//            // 硬编码 耦合
//            //Class clazz = Class.forName(env.getProperty("com.haoxiansheng.spring5.Book"));
//            // 利用配置文件加载的方式解决耦合
//            Class clazz = Class.forName(env.getProperty("order"));
//            order = (Order) clazz.newInstance();
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//        }
//        return order;
//    }

    /***
     *
     * @param name 配置文件的key
     * @param <T> 这我使用了泛型
     * @return
     */
    public static <T> T getObject(String name) {
        T t = null;
        try{
            Class clazz = Class.forName(env.getProperty(name));
            t = (T)clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t;
    }
}

2、测试

application.properties
book=com.haoxiansheng.spring5.Book
userDAO=com.haoxiansheng.spring5.UserDAO


    @Test
    public void  testFactory() {
        Book book = BeanFactory.getObject("book");
        System.out.println(book);
        UserDAO userDAO = BeanFactory.getObject("userDAO");
        System.out.println(userDAO);
    }

3、md笔记总结

# 2、总结

## 2)通用工厂的设计

> 方法声明的五部分 修饰符、返回值、方法名、参数列表、可选异常
```java
public class BeanFactory{
    private Properties env = new Properties();
    
    public static <T> T getObject(String name) {
        T t = null;
        try{
             Class clazz = Class.forName(env.getProperties(name));
             t = (T)clazz.newInstance();
        } catch (Exception e) {
            
        }
        return t;
    }
}

```

## 3) 通用工厂的类型

> 1、定义类型(类)
  2、通过配置文件告诉工厂(application.properties) [key = value]
  3、通过工厂获得类的对象
  Object object = BeanFactory.getBean("key"); 使用的时候需要类型转化  
  上面的方式就不需要转换了,因为我以及转换过了
  


> Spring本质:工厂ApplicationContext(ApplicationContext.xml)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值