Spring入门笔记-ioc

Spring核心ioc控制反转),aop(面向切面编程)
本次笔记主写Ioc
ioc主要作用用于解耦(降低各类之间的依赖关系)。
1.为什么要解耦
解耦有助于程序的维护,单独的功能做成独立模块,整个系统由一个个模块通过接口组合而成,如果需要更新或者修改局部功能,只要修改一个接口的一个模块,不影响整个系统其他功能使用。
举个简单的例子:零售商想批发商进货。
不解耦的情况:零售商直接问批发商要货物。
解耦的情况:零售商和批发商中间有一个代理人。零售商向代理人要货物,代理人向批发商要货物。
这样做有什么好处?
不解耦,如果商家拿钱跑路了。批发商心态直接炸了,自身也会出现各种问题。
解耦,如果商家拿钱跑路了。批发商甚至不知道商家出事了,自己仍然会向代理人要货物,虽然同样拿不到货物,但自身不会出问题。
把这样的关系应用在类与类之间就,以后要是某个类需要维护更改就不必牵动依赖其的下层。
2.如何实现解耦
要实现解耦就要明白耦合(依赖关系)在哪里,目前我们降低的依赖关系主要就是关键字new的使用。使创建实例对象时不直接去访问该类。

以下是利用工厂创建对象的代码:

package com.itheima.factory;

import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 一个创建Bean对象的工厂
 *
 *   它就是创建我们的service和dao对象的。
 *
 *   第一个:需要一个配置文件来配置我们的service和dao
 *           配置的内容:唯一标识=全限定类名(key=value)
 *   第二个:通过读取配置文件中配置的内容,反射创建对象
 *
 *   我的配置文件可以是xml也可以是properties
 */
public class BeanFactory {
//ioc转载实例化对象的容器,其结构是Map (key=实例化对象的名称,    
//	value=实例化对象)
    private static Map<String,Object> bean;
    //利用properties配置,本来应该用xml配置的。这里为简化代码就直接用properties。
    private static Properties pro;
    static {
        try {
            pro = new Properties();
            //利用类加载器获取当前目录下的配置文件bean.properties
            InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
            //加载流文件
            pro.load(in);
           //拿到配置文件key的集合keys
            Enumeration<Object> keys = pro.keys();
            bean = new HashMap<String, Object>();
            //遍历keys,利用key拿到对应的全限定类名
            while(keys.hasMoreElements()){
                String key = keys.nextElement().toString();
                String beanPath = pro.getProperty(key);
                //利用全限定类名创建对象(反射创建)
                Object value = Class.forName(beanPath).newInstance();
                //将对象名、对象封装如bean容器保存
                bean.put(key,value);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        }
        //利用key得到实例化对象的方法函数
        public static Object getBean(String beanName){
            return bean.get(beanName);
        }
    }

pro.properties文件

accountService=com.itheima.service.impl.AccountServiceImpl
accountDao=com.itheima.dao.impl.AccountDaoImpl

我们可以通过调用该工厂类来生产实例化对象,需要提供的即“类名称”和“全限定类名”。

你可能感兴趣的:(学习笔记)