02 Spring IOC

我们先看看我们在没有spring之前,程序间是怎么解耦的。
创建一个maven工程,整体的目录结构

1.创建dao层

IAccountDao.java

package com.itzn.dao;
public interface IAccountDao {
    void save();
}

AccountDaoImpl.java

package com.itzn.dao;
public class AccountDaoImpl implements IAccountDao {
    public void save() {
        System.out.println("保存账户");
    }
}

2.创建service层

IAccountService.java

package com.itzn.service;
public interface IAccountService {
    void save();
}

AccountServiceImpl .java

package com.itzn.service;
import com.itzn.dao.AccountDaoImpl;
import com.itzn.dao.IAccountDao;
import com.itzn.factory.BeanFactory;
public class AccountServiceImpl implements IAccountService {
    //默认不解耦方式
    //private IAccountDao iAccountDao = new AccountDaoImpl();
    private IAccountDao iAccountDao =(IAccountDao)BeanFactory.getBean("accountDao");
    public void save() {
        iAccountDao.save();
    }
}

3.创建配置文件bean.properties

accountService=com.itzn.service.AccountServiceImpl
accountDao=com.itzn.dao.AccountDaoImpl

4.创建Bean工厂层

BeanFactory.java

package com.itzn.factory;

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

public class BeanFactory {
    /**
     * 容器
     */
    private static Map<String, Object> beans;
    private static Properties props;

    static {
        try {
            //实例化对象
            props = new Properties();
            //获取properties文件流对象
            InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
            props.load(in);

            beans = new HashMap<String, Object>();
            Enumeration keys = props.keys();
            while (keys.hasMoreElements()) {
                String key = keys.nextElement().toString();
                String beanPath = props.getProperty(key);
                Object value = Class.forName(beanPath).newInstance();
                beans.put(key, value);
            }
        } catch (Exception e) {
            throw new ExceptionInInitializerError("dfdf");
        }
    }

    /**
     * 单例获取对象
     *
     * @param beanName
     * @return
     */
    public static Object getBean(String beanName) {
        return beans.get(beanName);
    }

    /**
     * 多实例
     * @param beanName
     * @return
     */
//    public static Object getBean(String beanName) {
//        Object bean = null;
//        try {
//            String beanPath = props.getProperty(beanName);
//            bean = Class.forName(beanPath).newInstance();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return bean;
//    }

}

5.测试

AccountTest .java

package com.itzn.ui;

import com.itzn.factory.BeanFactory;
import com.itzn.service.IAccountService;

public class AccountTest {
    public static void main(String[] args) {
        for (int i=0;i<3;i++)
        {
            IAccountService iAccountService= (IAccountService) BeanFactory.getBean("accountService");
            System.out.println(iAccountService);
            iAccountService.save();
        }
    }
}

测试结果

 

spring基于XML的IOC环境搭建入门
下面来看看使用Spring

1.新建maven工程,到spring引用,这里我们用5.0.2.RELEASE版本

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.itzn</groupId>
    <artifactId>day01_easy_02spring</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
</dependencies>
</project>

2.dao层

IAccountDao.java

package com.itzn.dao;

public interface IAccountDao {
    void save();
}

AccountDaoImpl.java

package com.itzn.dao;
public class AccountDaoImpl implements IAccountDao {

    public void save() {
        System.out.println("保存账户");
    }
}

3.service层
IAccountService.java

package com.itzn.service;

public interface IAccountService {
    void save();
}

AccountServiceImpl.java

package com.itzn.service;

import com.itzn.dao.AccountDaoImpl;
import com.itzn.dao.IAccountDao;

public class AccountServiceImpl implements IAccountService {
    private IAccountDao iAccountDao = new AccountDaoImpl();

    public void save() {
        iAccountDao.save();
    }
}

4.测试
AccountTest.java

package com.itzn.ui;

import com.itzn.dao.AccountDaoImpl;
import com.itzn.dao.IAccountDao;
import com.itzn.service.AccountServiceImpl;
import com.itzn.service.IAccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AccountTest {
    public static void main(String[] args) {
        //IAccountService iAccountService = new AccountServiceImpl();
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        IAccountService iAccountService = (IAccountService) ac.getBean("accountService");
        IAccountDao iAccountDao=ac.getBean("accountDao", AccountDaoImpl.class);
        System.out.println(iAccountService);
        System.out.println(iAccountDao);

    }
}

测试结果

 

这里说说BeanFactory 和 ApplicationContext 的区别
BeanFactory 才是 Spring 容器中的顶层接口。
ApplicationContext 是它的子接口。
BeanFactory 和 ApplicationContext 的区别:
创建对象的时间点不一样。
ApplicationContext:只要一读取配置文件,默认情况下就会创建对象。
BeanFactory:什么使用什么时候创建对象。


ApplicationContext 接口的实现类
ClassPathXmlApplicationContext:它是从类的根路径下加载配置文件 推荐使用这种
FileSystemXmlApplicationContext:它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
AnnotationConfigApplicationContext:当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。

posted @ 2019-12-16 22:13  码大坑  阅读(190)  评论(0编辑  收藏  举报