> 文章列表 > Spring核心容器之IOC详解

Spring核心容器之IOC详解

Spring核心容器之IOC详解

一、Ioc入门案例(XML版)

1、创建Maven工程,导入Spring坐标

 <properties><spring.version>5.2.10.RELEASE</spring.version></properties><dependencies><!--导入spring的context坐标,context依赖core、beans、expression aop--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!--junit单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>

2、定义Spring管理的类(接口

package com.liming.service;
public interface UserService {public void addUser();
}
package com.liming.service.impl;
import com.liming.service.UserService;
public class UserServiceImpl implements UserService {public void addUser() {System.out.println("这是在新增用户的service哦");}
}

3、创建Spring配置文件,配置对应类作为Spring管理的bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--id值要唯一,用于后期获取指定对象时的标志class要创建对象的类,是完全限定名--><bean id="ud" class="com.etime.dao.impl.UserDaoImpl"></bean><bean id="us" class="com.etime.service.impl.UserServiceImpl"></bean>
</beans>

注意:bean定义时id属性在同一个上下文中不能重复

4、初始化 Ioc容器(Spring核心容器),通过容器获取bean

	@Testpublic void test1(){//new的方式创建对象调用方法/*UserService userService = new UserServiceImpl();userService.addUser();*///Ioc方式创建对象调用方法//1、加载并获取SpringIOC容器ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");//2、根据id获取对象UserService userservice = ctx.getBean("userservice", UserService.class);userservice.addUser();}

二、Ioc详解

1、IOC配置文件详解

  • bean标签: 用于配置对象交给Spring 来创建。

默认情况下他会调用类中无参数的构造器,如果没有无参数构造器则不能成功创建

  • 基本属性:

    • id : Bean实例对象在Spring容器当中的唯一标识

    • class: Bean 的全限定类名(全类名)

2、创建容器

  • 方式一:类路径加载配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
  • 方式二:文件路径加载配置文件(绝对路径)
ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\\\JavaSSM305\\\\day01_Spring\\\\src\\\\main\\\\resources\\\\application.xml");
  • 方式三:使用注解方式时,创建容器方式
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
  • 加载多个配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("application1.xml","application2.xml");

3、获取bean

  • 方式一:使用bean名称获取
UserDao userdao = (UserDao) ctx.getBean("userdao");
  • 方式二:使用bean名称获取并指定类型
UserDao userdao = ctx.getBean("userdao", UserDao.class);
  • 方式三:使用bean类型获取
UserDao userdao = ctx.getBean(UserDao.class);

4、容器类层次结构图

Spring核心容器之IOC详解

  • BeanFactory :是Ioc容器的顶层接口,不提供开发人员使用,加载配置文件初始化BeanFactory对象时,不会创建对象,在获得(使用)对象时才采取创建对象。(延迟加载)
  • ApplicationContext: BeanFactory接口的子接口(Spring容器的核心接口),提供更多强大的功能,一般由开发人员使用。初始化时bean立即加载
  • ApplicationContext接口常用初始化类:
    -ClassPathXmlApplicationContext
    -AnnotationConfigApplicationContext

三、手动实现自己的IOC容器

Ⅰ、分析IOC 实现思路

Spring核心容器之IOC详解

Ⅱ、构建maven工程,引入依赖

	<properties><spring.version>5.2.10.RELEASE</spring.version></properties><dependencies><!--导入spring的context坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!--导入junit单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--引入dom4J--><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency></dependencies>

Ⅲ、设计接口

//dao层接口
public interface UserDao {public abstract void addUser();
}//dao层实现类
public class UserDaoImpl implements UserDao {@Overridepublic void addUser() {System.out.println("这是在新增用户的dao哦");}
}
//service层接口
public interface UserService {public abstract void addUser();
}//service层接口实现类
public class UserServiceImpl implements UserService {@Overridepublic void addUser() {System.out.println("这是在新增用户的service哦");}
}

Ⅳ、在resources中创建myapplication.xml核心配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--标签名自定义(随意)-->
<objects><object id="userDao" name="com.etime.dao.impl.UserDaoImpl"></object><object id="userService" name="com.etime.service.impl.UserServiceImpl"></object>
</objects>

Ⅴ、使用dom4j技术解析xml配置文件

package com.liming.util;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MyFactory {private static Map<String,Object> map = new HashMap<>();static {try {//1、创建一个Dom4j的解析器对象,代表了整个dom4j框架SAXReader reader = new SAXReader();//2、把XML文件加载到内存中成为一个Document文档对象Document  document = reader.read("src/main/resources/myapplication.xml");//3、获取根元素对象Element root = document.getRootElement();//4、获取根元素的所有子元素List<Element> elements = root.elements();//5、获取每一个元素的指定属性值for (Element element : elements) {String name = element.attributeValue("name");String id = element.attributeValue("id");//根据获取的name属性的值,创建对象Class clazz = Class.forName(name);//newInstance()调用无参构造创建类对象Object obj = clazz.newInstance();//根据id添加对象到集合map.put(id,obj);}} catch (DocumentException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}//对外提供获取对象方法public static Object getBean(String id){return map.get(id);}
}

Ⅵ、编写测试文件,展示测试结果

 	@Testpublic void test2(){UserDao userdao = (UserDao) MyFactory.getBean("userdao");userdao.addUser();UserService userservice = (UserService) MyFactory.getBean("userservice");userservice.addUser();}

Spring核心容器之IOC详解