我们先看看我们在没有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=;i<;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.</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..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 容器。它用来读取注解。

02 Spring IOC的更多相关文章

  1. Spring框架学习02——Spring IOC 详解

    1.Spring IOC的基本概念 IOC(Inverse of Control)反转控制的概念,就是将原本在程序中手动创建对象的控制权,交由Spring框架管理.当某个Java对象(调用者)需要调用 ...

  2. 02.Spring Ioc 容器 - 创建

    基本概念 Spring IoC 容器负责 Bean 创建.以及其生命周期的管理等.想要使用 IoC容器的前提是创建该容器. 创建 Spring IoC 容器大致有两种: 在应用程序中创建. 在 WEB ...

  3. Spring IOC 源码简单分析 02 - Bean Reference

    ### 准备 ## 目标 了解 bean reference 装配的流程 ##测试代码 gordon.study.spring.ioc.IOC02_BeanReference.java   ioc02 ...

  4. Spring源码解析02:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  5. Spring IOC的使用

    控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转,目的是为了获得更好的扩展性和良好的可维护性.所谓依 ...

  6. spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途

    Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...

  7. spring原理案例-基本项目搭建 03 创建工程运行测试 spring ioc原理实例示例

    下面开始项目的搭建 使用 Java EE - Eclipse 新建一 Dynamic Web Project Target Runtime 选 Apache Tomcat 7.0(不要选 Apache ...

  8. Spring - IoC(7): 延迟实例化

    默认情况下,Spring IoC 容器启动后,在初始化过程中,会以单例模式创建并配置所有使用 singleton 定义的 Bean 的实例.通常情况下,提前实例化 Bean 是可取的,因为这样在配置中 ...

  9. 第02章 IOC和bean的配置

    第02章 IOC容器和Bean的配置 1.IOC和DI ①IOC(Inversion of Control):反转控制. 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资 ...

随机推荐

  1. nohup保证程序后台运行

    前言 我们运行某些命令的时候,它会默认在前台执行.如果要进行其他操作,则需要先停掉此程序.然后就蛋疼了.   解决 碰到这种情况,我们可以使用"nohup"命令和"&am ...

  2. 软件素材---linux C语言:拼接字符串函数 strcat的用例(与char数组联合使用挺好)

    [头文件]#include <string.h> [原型] 1 char *strcat(char *dest, const char *src); [参数]: dest 为目标字符串指针 ...

  3. ubuntu 安装 iperf

    iperf的github https://github.com/esnet/iperf/releases 解压 sudo tar -zvxf iperf-3.6.tar.gz -C /usr/loca ...

  4. AJAX-前后端交互的艺术

    AJAX-前后端交互的艺术 为什么要用AJAX? 当我们通过提交表单向服务器提交内容,或者进行一些其他操作,均涉及到了与浏览器之间的交互,传统的方式与AJAX方式的处理方法是不同的 传统方式:用户触发 ...

  5. 剑指offer48:不用加减乘除做加法

    1 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 2 思路和方法 位运算符:两个数异或(^)[1^0=1, 1^1=0, 0^0=0, 0^1=1, 5^5 ...

  6. 第五章 模块之random 、hashlib、time /datetime

    5.2 random 返回随机生成的一个实数 random.randint() 返回随机生成的一个实数 import random #调用模块​def get_random_code(length=6 ...

  7. redis集合数据类型---SET

    一.概述 redis的set是string类型的无序集合 集合成员是唯一的,这就意味着集合中不能出现重复的数据. 集合中最大的成员数为2^32-1(4294967295,每个集合可存储40多亿个成员) ...

  8. vs setup 自动下载依赖的framework配置

    1.项目->属性->签名->选中为ClickOnce清单签名->创建测试证书 2.项目->属性->安全性->启用ClickOnce安全设置 3.setup项目 ...

  9. Java单例最好的设计模式:Spring 之 GlobalAdvisorAdapterRegistry

    先上代码: public abstract class GlobalAdvisorAdapterRegistry { /** * Keep track of a single instance so ...

  10. WebSocket 的应用

    后面用到了再来做整理 链接地址:https://www.cnblogs.com/zhaof/p/9833614.html