spring IOC(DI)实验

软件151  张鑫栋

一、IOC的意思是控件反转也就是由容器控制程序之间的关系,把控件权交给了外部容器,之前的写法,由程序代码直接操控,而现在控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。DI(Dependency Injection,依赖注入)。IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。

IOC实现的原理:

定义DAO接口和接口的实现类

package com.dao;

public interface PersonDAO {

public void save();

}

package com.dao.impl;

import com.dao.PersonDAO;

public class PersonDaoImpl implements PersonDAO {

@Override

public void save() {

System.out.println("保存");

}

}

创建一个Junit测试类

package com.test;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.dao.PersonDAO;

import com.myUtil.MyClassPathXmlApplicationContext;

import com.service.PersonService;

public class PersonTest {

@Test

public void instanceSpring1(){

/*

* spring 的实现

*/

//IOC

ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

PersonDAO pd = (PersonDAO) ac.getBean("personDAO");

pd.save();

//DI

PersonService ps = (PersonService) ac.getBean("personService");

ps.save();

}

@Test

public void instanceSpring2(){

/**

* 我的实现

*/

MyClassPathXmlApplicationContext mac = new MyClassPathXmlApplicationContext("beans.xml");

PersonDAO mpd = (PersonDAO) mac.getBean("personDAO");

mpd.save();

//DI

PersonService ps = (PersonService) mac.getBean("personService");

ps.save();

}

}

方法instanceSpring1为Spring中的实现用ClassPathXmlApplicationContext类,要实现IOC的原理要定义自己的MyClassPathXmlApplicationContext首先读出beans.xml中的配置信息,通过反射机制实现bean,最后注入所需要的bean。

package com.myUtil;

import java.beans.Introspector;

import java.beans.PropertyDescriptor;

import java.lang.reflect.Method;

import java.net.URL;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

public class MyClassPathXmlApplicationContext {

// xml所有的属性

private ArrayList<BeanDefinition> beanDefinitions = new ArrayList<BeanDefinition>();

// xml中所有的bean

private Map<String, Object> sigletons = new HashMap<String, Object>();

public MyClassPathXmlApplicationContext(String file) {

readXml(file);

instanceBeans();

instanceObject();

}

/**

* 注入

*/

private void instanceObject() {

for (BeanDefinition beanDefinition : beanDefinitions) {

//判断有没有注入属性

if (beanDefinition.getProperty() != null) {

Object bean = sigletons.get(beanDefinition.getId());

if (bean != null) {

try {

//得到被注入bean的所有的属性

PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();

//得到所有的注入bean属性

for(PropertyDefinition propertyDefinition:beanDefinition.getProperty()){

for(PropertyDescriptor propertyDescriptor:ps){

if(propertyDescriptor.getName().equals(propertyDefinition.getName())){

Method setter = propertyDescriptor.getWriteMethod();//获取set方法

if(setter!=null){

setter.setAccessible(true);//得到private权限

//注入属性

setter.invoke(bean, sigletons.get(propertyDefinition.getRef()));

}

break;

}

}

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}   }

}   }

/**

* 实例所有的bean

*/

private void instanceBeans() {

for (int i = 0; i < beanDefinitions.size(); i++) {

BeanDefinition bd = beanDefinitions.get(i);

try {

try {

if (bd.getClassName() != null

&& !bd.getClassName().equals(""))

sigletons.put(bd.getId(), Class.forName(

bd.getClassName()).newInstance());

} catch (InstantiationException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}    }

/**

* 读xml

* @param file

*/

private void readXml(String file) {

try {

SAXReader reader = new SAXReader(); // 使用SAX方式解析XML

URL xmlPath = this.getClass().getClassLoader().getResource(file);

Document doc = reader.read(xmlPath);

Element root = doc.getRootElement(); // 取得根节点

List<Element> beans = root.elements();

for (Element element : beans) {

String id = element.attributeValue("id");// id;

String clazz = element.attributeValue("class");

BeanDefinition bd = new BeanDefinition(id, clazz);

// 读取子元素

if (element.hasContent()) {

List<Element> propertys = element.elements();

for (Element property : propertys) {

String name = property.attributeValue("name");

String ref = property.attributeValue("ref");

PropertyDefinition pd = new PropertyDefinition(name,

ref);

bd.getProperty().add(pd);

}     }

beanDefinitions.add(bd);

}

} catch (Exception e) {

// TODO: handle exception

}

}

/**

* 通过名字得到bean

* @param str

* @return

*/

public Object getBean(String str) {

return sigletons.get(str);

} }

读取所的bean实体

package com.myUtil;

import java.util.ArrayList;

import java.util.List;

public class BeanDefinition {

private String id;

private String className;

private List<PropertyDefinition> property = new ArrayList<PropertyDefinition>();

public BeanDefinition(String id, String className) {

super();

this.id = id;

this.className = className;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getClassName() {

return className;

}

public void setClassName(String className) {

this.className = className;

}

public List<PropertyDefinition> getProperty() {

return property;

}

public void setProperty(List<PropertyDefinition> property) {

this.property = property;

}

}

注入属性实体

[java] view plain copy

package com.myUtil;

public class PropertyDefinition {

private String name;

private String ref;

public PropertyDefinition(String name, String ref) {

this.name = name;

this.ref = ref;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getRef() {

return ref;

}

public void setRef(String ref) {

this.ref = ref;

}

}

业务接口和实现类

package com.service;

public interface PersonService {

public void save();

}

[java] view plain copy

package com.service.impl;

import com.dao.PersonDAO;

import com.service.PersonService;

public class PersonServiceImpl implements PersonService{

private PersonDAO pdo;

public PersonDAO getPdo() {

return pdo;

}

public void setPdo(PersonDAO pdo) {

this.pdo = pdo;

}

@Override

public void save() {

pdo.save();

}

}

beans.xml配置

<?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/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean id="personDAO" class="com.dao.impl.PersonDaoImpl"></bean>

<bean id="personService" class="com.service.impl.PersonServiceImpl">

<property name="pdo" ref="personDAO"></property>

</bean>

</beans>

时间: 2024-08-30 02:50:51

spring IOC(DI)实验的相关文章

Spring -- IOC/DI 基础概念的理解

Spring -- IOC/DI 基础概念 思维导图: ------------------------------------------------------- IoC/DI 的基本概念 IoC是什么 ? IoC -- Inversion of control, 控制反转   在Java开发中,IoC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则. 理解IoC的关键是明

[Spring系列01]Spring IOC/DI模拟

本文以一个简单的实例大致模拟Spring IOC/DI的运行原理,代码简单分dao,model,service三层.即:dao 与数据库的操作,增删改查等方法model 一般都是javabean对象,例如与数据库的某个表相关联.service 供外部调用,等于对dao,model等进行了包装. 程序结构图如下: 先粘贴部分代码,再进行解释: UserDAO.java package com.ctsh.dao; import com.ctsh.model.User; public interfac

Spring IOC/DI/注解

一.定义:Spring 是一个开源的控制反转(Inversion of Control,IoC/DI)和面向切面(AOP)的容器框架,它的主要目的是简化企业开发 二.实例化Spring容器: 方法一:在类路径下寻找配置文件来实例化容器 1 ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"beans.xml"}); 方法二:在文件系统路径下寻找配置文件来实例化容器 1 Applicatio

Spring IoC/DI

前言 假设项目层次划分包括logic层和dao层,logic层调用dao层完成业务逻辑,dao层一般与数据库交互.定义两个组件,TestLogic和TestDao,分别操作接口ILogic和IDao,这样程序开发时需要考虑怎样管理这两个组件. 传统方式 这种方式中,当TestLogic组件需要调用TestDao组件时,直接使用关键字new IDao testDao = new TestDao(); 这种方式简单直观,但造成了对外部组件的严重依赖,程序高度耦合,效率低下.当项目需要更换组件时需要修

Spring+IOC(DI)+AOP概念及优缺点

Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应用一般不依赖于spring的类. 容器:Spring是个容器,因为它包含并且管理应用对象的生命周期和配置.如对象的创建.销毁.回调等. 框架:Spring作为一个框架,提供了一些基础功能,(如事务管理,持久层集成等),使开发人员更专注于开发应用逻辑. Spring的优点1.降低了组件之间的耦合性 ,

spring ioc DI 理解

下面是我从网上找来的一些大牛对spring ioc和DI的理解,希望也能让你对Spring ioc和DI的设计思想有更进一步的认识. 一.分享Iteye的开涛对Ioc的精彩讲解 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们

spring IOC/DI容器的理解

参与者:应用程序和spring正向:现在的程序方向,A对象要使用B对象,现在是A里面直接创建B的实例,然后调用.publc class A{ void t1(){ new B().t2();  }}public class B{void t2(); 简而言之,就是程序需要什么.就由程序主动去获取需要的资源,这个方向就是正向.容器是用来创建和装配对象,并管理对象生命周期的.对于应用程序而言,就是被动实例化和被动接受依赖了.装配:在spring容器内拼凑bean叫作装配.装配bean的时候,你是在告

spring IOC DI LifeCycle

spring IOC 创建javaBean工厂的三种方式: 1.BeanFactory bf = new XmlBeanFactory(new ClassPathResource("bean.xml")); BeanFactory:spring管理JavaBean的顶级接口,直接用这个接口创建的工厂有延迟加载的作用 常用的有ApplicationContext  ac = new ClassPathXmlAppliactionContext("bean.xml");

记录学习Spring(IOC/DI)

根据自己学习的Spring做一些记录,主要是为了方便自己查阅复习. 一.介绍Spring Spring是一个基于IOC和AOP的结构J2EE系统的轻量级框架; 轻量级主要变现为不需要任何的容器就可以直接运行;  IOC 反转控制 是Spring的基础,Inversion Of Control ; 也就是创建对象由以前的程序员自己new 构造方法来调用,变成了交由Spring创建对象 ; DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接