软件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-09-28 22:29:17

软件151 王楚博 接口的实现的相关文章

软件151 王楚博 aodp

一.AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面编程. AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务, 如事务管理.安全检查.缓存.对象池管理等. AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理, AOP 代理则可分为静态代理和动态代理两大类,其中静态代理是指使用 AOP 框架提供的命令进行编译, 从而在编译阶段就可生成 AOP 代理

软件151 王楚博 maven的导入

一.maven 包的导入 清单如下: <!-- Inherit defaults from Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.1.BUILD-SNAPSHOT</version>

软件151 王楚博 JavaEE的配置

一.准备以下压缩包 1.JDK1.7 文件:jdk1.7.rar 2. eclipse-jee-mars-2 文件:32位系统准备eclipse-jee-mars-2-win32.zip,64位系统准备eclipse-jee-mars-2-win32-x86_64.zip 3.maven 文件:maven-3.3.9.rar 4.maven仓库(可以从网上下载,但是速度慢) 文件:.m2.rar 二.安装(解压) 1.选择一个工作盘,如E:盘,建立目录jee 2. 将压缩包放到jee目录下,并解

软件151 王楚博 struts

一.下载Struts 建立web项目,给项目添加外部引用包(project-properties-Java Build Path-Add External Jars...).添加的包有:commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar,commons-logging-api-1.1.jar,freemarker-2.3.16.jar,javassist-3.7.ga.jar,ognl-3.0.jar,struts2-core-2.2.1.1.ja

一文读懂低成本的软件对接方式,数据接口生成器应用于医疗软件全解析

如今,以"智慧医疗"为代表的健康信息化建设几乎在国内每一个大中城市上马,并逐步在每一家医院落地.无论是围绕智慧医疗所展开的公卫平台建设.精准医疗.医联体建设.远程医疗等一系列产业链,还是医院内部的信息化升级,其核心基础都必须建立在医疗大数据之上.医疗领域的数据源虽然众多,但医院各种系统的数据库还是最重要的医疗数据来源. 在中国,一家普通医院的软件系统往往有十几个到几十个不等,三甲医院内部信息系统则可能高达上百个.而国内医疗IT市场相关软件厂家多达几千家,国内前20的医疗IT厂商加起来却

跟王老师学接口:(五)实例:对电子宠物系统进行重构

对电子宠物系统进行重构 主讲教师:王少华   QQ群号:483773664 一.重构需求 定义Eatable接口,在接口中定义eat()方法,表示吃饭功能 定义FlyingDiscCatchable接口,在接口中定义catchingFlyDisc()方法,表示接飞盘功能 定义Swimmable接口,在接口中定义swim()方法,表示游戏功能 定义抽象类Pet,包括宠物名称(name).健康值(health)和与主人亲密度(love)属性,并提供抽象方法print(),用来输出宠物信息 定义狗类(

跟王老师学接口(四):面向接口编程:命令模式

面向接口编程:命令模式 主讲教师:王少华   QQ群号:483773664 学习目标 理解面向接口编程的优势 掌握命令模式 一.命令模式 (一)场景 假设你的Boss给你这样一个任务要你处理一个数组.但是没有告诉你,如何处理这个数组,是对其进行输出,还是对其排序.遇到这样的Boss很烦!!! (二) 分析 对于这样的需求,我们第一个想到的就是把数组作为方法的形参,但是我们是否可以把"对数组的处理行为"也作为一个方法的形参传入呢? 因为Java不允许代码块的单独存在,所以我们不可能将&q

用Qt写软件系列六:博客园客户端的设计与实现(用Fiddler抓包,用CURL提交数据,用htmlcxx解析HTML)

引言 博客园是本人每日必逛的一个IT社区.尽管博文以.net技术居多,但是相对于CSDN这种业务杂乱.体系庞大的平台,博客园的纯粹更得我青睐.之前在园子里也见过不少讲解为博客园编写客户端的博文.不过似乎都是移动端的技术为主.这篇博文开始讲讲如何在PC端编写一个博客园客户端程序.一方面是因为本人对于博客园的感情:另一方面也想用Qt写点什么东西出来.毕竟在实践中学习收效更快. 登录过程分析 登录功能是一个客户端程序比不可少的功能.在组装Http数据包发送请求之前,我们得看看整个登录是怎样一个过程.F

软件151 王涛 数据库的链接

package Com.Cqvie; import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement; public class Test { //常量定义(一般用全大写)localhostpublic static final String DBDRIVER="net.sourceforge.jtds.jdbc.Driver";public static final String D