`

关于JAVA动态加载类[简单IOC的实现] -- vb2005xu自己动手

阅读更多
JAVA和PHP在动态加载类上有很大的不同,对于PHP来说,想要动态加载类只需,以下代码就可以实现,这个也可以简单实现为 一个单一入口的demo

MVC.php
class MVC{
	var $cur_ctl ;//当前控制器
	var $cur_act ;//当前action
	
	function MVC()
	{
		$this->cur_ctl = null ;$this->cur_act = null ;
		if (isset($_REQUEST['ctl']) && ! empty($_REQUEST['ctl']))
		{
			$this->cur_ctl = $_REQUEST['ctl'] ;			
		}
		if (isset($_REQUEST['act']) && ! empty($_REQUEST['act']))
		{
			$this->cur_act = $_REQUEST['act'] ;			
		}
	}
	function run()
	{
		$ctl_name = 'C_' ; //控制器前缀
		$act_name = 'a_' ;  //事件前缀
		if (empty($this->cur_ctl))
			$ctl_name = "{$ctl_name}Default" ;
		else
			$ctl_name = "{$ctl_name}{$this->cur_ctl}" ;	

		if (empty($this->cur_act))
			$act_name = "{$act_name}Index" ;
		else
			$act_name = "{$act_name}{$this->cur_act}" ;

		// exec this
		require "{$ctl_name}.php";
		$ExecMVC = & new $ctl_name();
		$ExecMVC->$act_name(); 
	}
}


index.php
require('MVC.php');
$mvc = & new MVC();
$mvc->run();


控制器的实现例子
class C_Default
{	
	function C_Default()
	{
		
	}
    function a_index()
    {		
		echo 'suess' ;
    }
    function a_bbs()
    {		
		echo 'bbs' ;
    }
  
}


就可以在 index.php中通过ctl和act来实现动态页面的跳转,例如index.php?act=bbs

但是对于JAVA来讲,就相对麻烦一些,这里给出一个简单的动态加载类的demo,希望对大家有所帮助:
import java.util.Properties;
import java.lang.ClassLoader ;
import java.io.* ;

/**
 * 读取JAVA资源配置文件中或命令参数中指定的接口实现类  
 */
public class MySimpleIoc {
	
	private ClassLoader myClassLoader ;
	
	private static MySimpleIoc ioc ;
	
	private Properties properties ;//配置文件
	
	private MySimpleIoc()
	{
		myClassLoader = MySimpleIoc.class.getClassLoader() ;
		this.initConfFile() ;
	}
	
	public static MySimpleIoc getInstance()
	{
		if (ioc == null)
			ioc = new MySimpleIoc() ;
		return ioc ;		
	}
	
	
	//加载指定的IOC配置文件./ioc.conf
	private void initConfFile() {
		try {
			// "/"表示以当前类的包的根路径为基准路径
			InputStream in = MySimpleIoc.class.getResourceAsStream("./ioc.conf");			
			properties = new Properties();
			properties.load(in);
		}catch(Exception e) {
			this.println ("IOC配置文件[./ioc.conf]读取失败,请检查") ;
			e.printStackTrace();
		}
	}

	private void println(Object msg)
	{
		System.out.println (msg) ;
	}
	
	//clazz 是类名的全称在配置文件中对应的字符串 -- java.lang.String
	public Object getBean(String clazz){
		Object implClass = null ;
		 
		String implClassName = properties.getProperty(clazz) ; 
		
		try {
			//这里可以扩展下,以防止出现空指针异常 使用一个缺省的测试类来做
			implClass = this.myClassLoader.loadClass(implClassName).newInstance() ;	    	
	    }
	    catch (ClassNotFoundException ex) {
	    	this.println ("Class: " + implClassName + "had not found : " + ex);
	    	ex.printStackTrace() ;
	    }
	    catch (InstantiationException ex) {
	    	this.println ("Class: " + implClassName + ".newInstance() reported InstantiationException : " + ex );
	    	ex.printStackTrace() ;
	    }
	    catch (IllegalAccessException ex) {
	    	this.println ("Class: " + implClassName + "reported IllegalAccessException: " + ex);
	    	ex.printStackTrace() ;
	    }
	    
		return implClass ;		
	}
	
	public static void main(String args[])
    {
    	I接口类型 iavs = null ;
    	iavs = (I接口类型)
    		MySimpleIoc.getInstance().getBean("配置文件中设置的接口实现类的标签名称"); 
	    System.out.println (iavs.toString() ) ; //这个是实现类的方法
	    System.out.println ("======================================") ;
	   
    } 
}



配置文件ioc.conf同这个类文件应该在同一目录中,可以自行更改上面的文件路径
#要求类名的全称 -- eg. java.lang.String

#attackerVarityServce
attackerVarityService=vb2005xu.attacker.service.IAttackerVarityServce
attackerVarityImpl=vb2005xu.attacker.service.impl.AttackerVarityImpl


#attackerRecord
attackerRecordService=vb2005xu.attacker.service.bo.AttackerRecord
attackerRecordImpl=vb2005xu.attacker.dao.AttackerRecordImpl

#attackerDBDao
attackerDBDaoService=vb2005xu.attacker.dao.IAttackerDBDao
attackerDBDaoImpl=vb2005xu.attacker.dao.db4o.AttackerDBDaoImpl

3
0
分享到:
评论

相关推荐

    Spring5 框架 ---- IOC容器 ---- 代码

    Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- ...

    Java-Spring-SpringIoC容器-SpringIoC的学习

    在Java Spring框架中,Spring IoC(Inversion of Control,控制反转)是核心特性之一,它使得应用程序的组件之间的依赖关系不再由代码直接管理,而是交由Spring IoC容器负责。这种设计模式降低了代码间的耦合,提高...

    Spring的IoC实现案例

    在本文中,我们将深入探讨如何使用Spring的Inversion of Control(IoC)容器来实现一个具体的案例:控制打印机(Printer)类与不同类型的纸张(Paper)类的交互。Spring的IoC允许我们解耦组件,使代码更加灵活且易于...

    利用Java的反射与代理实现IOC模式

    2. 创建Bean的具体实现类。 3. 创建配置文件(如XML或基于注解的方式),定义Bean的ID、类名以及依赖关系。 4. 使用Spring的ApplicationContext或BeanFactory加载配置文件,创建IOC容器。 5. 通过容器的`getBean()`...

    自己实现ioc实例demo

    在这个“自己实现ioc实例demo”中,我们将探讨如何通过XPath解析XML文件来实现这一功能。 首先,让我们了解什么是依赖注入。在传统的编程中,一个类通常会自行创建它需要的对象,这导致了类与对象的紧密耦合。而在...

    Spring框架-IoC实现CRUD

    Spring框架-IoC实现CRUD

    用java写的一个简单的ioc实现,初学的朋友可以看看

    通过自己动手实现,初学者可以更好地理解Spring是如何在幕后管理对象和处理依赖的,这对于提升编程技能和设计模式的理解非常有益。同时,这也是软件开发中常用的一种学习方法——通过模仿和实践来深入理解复杂的概念...

    springIoc实现原理

    依赖注入是IoC的一种具体实现方式,它允许对象在运行时动态地获得依赖。Spring支持三种类型的依赖注入: 1. **构造器注入**:通过构造函数传入依赖对象。 2. **设值注入**:使用setter方法注入依赖。 3. **接口注入...

    IOC容器简单实现

    **IOC容器简单实现** IOC(Inversion of Control)容器是软件设计模式中的一种,它将对象的创建和管理权从代码本身转移到一个外部容器,即IOC容器。这种反转控制使得程序更加灵活,降低了组件之间的耦合性,提高了...

    Spring-ioc-jar

    这个jar文件"Spring-ioc-jar"包含了实现Spring IOC功能所需的关键类和接口,是学习和使用Spring IOC技术的基础。 Spring框架的IOC容器是其核心组件,主要由`ApplicationContext`和`BeanFactory`两个接口代表。`...

    自己动手实现IOC和MVC源码

    【标题】"自己动手实现IOC和MVC源码"揭示了本文的核心内容,即通过实践来理解并构建IoC(Inversion of Control)和MVC(Model-View-Controller)这两种重要的软件设计模式的源代码。这两者是现代Java Web开发中...

    java练习之模拟SPRING IOC,我的SUMMER

    在本Java练习中,我们将深入理解并实现Spring框架的核心组件——IoC(Inversion of Control,控制反转)容器。这个练习分为三个主要部分,旨在帮助我们掌握XML配置文件的读取,模拟Spring的IoC机制,以及对Struts...

    Spring-IoC 容器 - v1.01

    IoC的一个常见实现是依赖注入(Dependency Injection,简称DI),它允许对象之间的依赖关系在运行时动态地被管理和配置,而不是由对象自己来创建或查找其依赖。 **设计用户持久化类** 设计用户持久化类通常涉及...

    自己实现IOC容器

    当我们自己动手实现IOC容器时,可以更深入地理解其内部的工作机制。 ### 1. IOC基本原理 **控制反转**的核心思想是将对象的创建和管理权交给容器,而不是由对象自身负责。这样,对象不再需要知道依赖的具体实现,...

    ioc框架,通过动态代理实现.

    1. JDK动态代理:JDK内置的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口提供了实现动态代理的能力。当被代理的类实现了至少一个接口时,我们可以使用JDK动态代理来创建一个代理类,这个代理...

    Java开发学习(二)----IOC、DI入门案例.doc

    3. **编写类**:创建`BookService`接口,它的实现类`BookServiceImpl`,以及`BookDao`接口和其实现类`BookDaoImpl`。`BookServiceImpl`中通过实例化`BookDaoImpl`来完成对数据库的操作。 4. **配置Spring**:在`...

    基于java简单模拟实现spring_ioc

    在这个项目中,“基于java简单模拟实现spring_ioc”显然是为了帮助开发者理解Spring的IoC容器是如何工作的,以及如何通过Java代码来模拟这个过程。 首先,让我们了解什么是Spring的IoC。IoC是一种设计模式,它将...

    Java Spring代理模式AOP-IOC分析

    Java中有两种方式来实现动态代理,一种是使用JDK中的Proxy类,另一种是使用CGLIB库。使用JDK中的Proxy类,可以生成代理对象,并将其绑定到原始对象上。使用CGLIB库,可以生成代理对象,并将其绑定到原始对象上,同时...

Global site tag (gtag.js) - Google Analytics