`
whoosh
  • 浏览: 235368 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

在Java Web项目里实现IOC(不使用框架,自己通过代码实现)

阅读更多
一:IOC的好处
有的项目在管理DAO的时候会抽象出一个interface,如ArticleDao;然后去做一些他的实现:如ArticleDaoForDb2或者ArticleDaoForOracle。这样在Servlet里面new一个ArticleDao可以写成:
ArticleDao articleDao=new ArticleDaoForOracle

这种做法带来的问题:项目一大,就有很多dao类,如ContentDao,PersonDao等等等。如果有一天要将他们的实现从ForOracle改成ForDb2,这样在代码里面的改动就会很大。
IOC:控制翻转,本来需要在代码里面将某个类的具体实现new出来的,现在不用new了,只需要在配置文件做一下配置。这样一来,如果我们想将dao的实现从ForOracle改成ForDb2。只需要在一个配置文件里面改就行了,不用再在很多个的servlet类里面一个个的改。
个人认为IOC适用于一些大项目,对于一些小项目,本身就只有一个实现,就没有必要做这个,因为有了IOC也会增加项目的复杂度。

二:在项目中实现IOC
1.创建一个beans.properties文件,用于存放bean的具体实现:
articleDao=bruce.zhao.cms.backend.dao.impl.ArticleDaoImpl
channelDao=bruce.zhao.cms.backend.dao.impl.ChannelDaoImpl

2.创建一个制造bean的工厂,通过反射来创造写在配置文件里面的那些bean
public class PropertiesBeanFactory implements BeanFactory{

	//该工厂类产生的bean都放在这个map里面
	Map beans=new HashMap();
	//默认的properties文件的名字为:beans.properties
	private String congfigLocation="beans.properties";
	
	public PropertiesBeanFactory(){
		init();
	}
	
	public PropertiesBeanFactory(String configLocation){
		setCongfigLocation(configLocation);
		init();
	}
	
	private void init(){
		try {
			Properties properties=new Properties();
			
			//将properties文件load进来
			properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(congfigLocation));
			//将properties对象转换为一个set,便于遍历
			Set set=properties.entrySet();
			//循环遍历properties文件里面的一条条记录
			for (Iterator iterator=set.iterator(); iterator.hasNext(); ) {
				Map.Entry entry=(Map.Entry)iterator.next();
				String keyString=(String)entry.getKey();
				String className=(String)entry.getValue();
				Class clz=Class.forName(className);
				Object bean= clz.newInstance();
				//将实例化好的类放进map
				beans.put(keyString, bean);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
	
	public Object getBean(String name){
		return beans.get(name);
	}

	/**
	 * @return the congfigLocation
	 */
	public String getCongfigLocation() {
		return congfigLocation;
	}

	/**
	 * @param congfigLocation the congfigLocation to set
	 */
	public void setCongfigLocation(String congfigLocation) {
		this.congfigLocation = congfigLocation;
	}
}

3.创建一个InitBeanFactoryServlet,该servlet在web.xml里面不需要配置对应的map,因为只有在初始化的时候会用到,但是需要设置启动项为0,让他最先初始化。
<servlet>
    <description></description>
    <display-name>InitBeanFactoryServlet</display-name>
    <servlet-name>InitBeanFactoryServlet</servlet-name>
    <servlet-class>bruce.zhao.cms.backend.view.InitBeanFactoryServlet</servlet-class>
    <init-param>
      <param-name>configLocation</param-name>
      <param-value>beans.properties</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>

该类的作用:在容器启动的时候调用PropertiesBeanFactory来产生写在properties配置文件里面的类,把他们放在ServletContext里面。
public class InitBeanFactoryServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	public static final String INIT_FACTORY_NAME="_my_bean_factory";

	/* (non-Javadoc)
	 * @see javax.servlet.GenericServlet#init()
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		BeanFactory beanFactory=null;
		String configLocation =config.getInitParameter("configLocation");
		if (configLocation==null) {
			//如果在web.xml里面没有配置properties文件的名字则
			beanFactory=new PropertiesBeanFactory();
		}else {
			beanFactory=new PropertiesBeanFactory(configLocation);
		}
		config.getServletContext().setAttribute(INIT_FACTORY_NAME, beanFactory);
	}

}

4.创建一个BaseServelt,所有别的servlet都继承自他,他的子类会先调用他的service方法,通过反射查看子类里面有没有bean的set方法,如果有就在ServletContext里面获取对应的bean。(第三部的时候,InitBeanFactoryServlet 已经将所有的bean都放到了ServletContext里面)
public class BaseServelt extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		BeanFactory beanFactory=(BeanFactory) getServletContext().getAttribute(InitBeanFactoryServlet.INIT_FACTORY_NAME);
		
		Method[] methods=this.getClass().getMethods();
		for (Method method : methods) {
			if (method.getName().startsWith("set")) {
				String propertyName=method.getName().substring(3);
				StringBuffer sb =new StringBuffer(propertyName);
				sb.replace(0, 1, (propertyName.charAt(0)+"").toLowerCase());
				propertyName=sb.toString();
				Object bean= beanFactory.getBean(propertyName);
				try {
					method.invoke(this, bean);
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}
			}
		}
		
		super.service(request, response);
	}

}

4
5
分享到:
评论
3 楼 whoosh 2014-12-11  
liushaohan01 写道
假如这个和  struts2一起使用呢?该怎么更改?

不建议和Structs一起用,因为Structs也有这个功能。
如果系统不大,可以直接用这个。
2 楼 liushaohan01 2013-03-26  
假如这个和  struts2一起使用呢?该怎么更改?
1 楼 仅此而已 2011-07-26  
相当棒了。  java的反射机制。向你学习了。

相关推荐

    ioc框架实现

    总结来说,"ioc框架实现"是关于使用Spring框架的IOC功能来构建一个包含Controller、Service、DAO三层架构的Web应用,通过setter注入实现组件间的依赖关系,并结合JSP进行视图展示。这样的设计模式提高了代码的可测试...

    java web开发框架

    Java Web开发框架是用于构建动态、交互式的Web应用程序的强大工具,它简化了开发过程,提高了代码的可重用性和可维护性。本框架的核心目标是为开发者提供一套高效且易于学习的开发环境,以实现快速原型设计和项目...

    Java+Web项目企业事务管理系统源码 (1)Java源码

    在下载并解压提供的"javaSrc95.zip"文件后,可以通过阅读源代码和按照"下载及使用说明.txt"来学习和理解整个项目的架构和功能实现。这将有助于提升Java Web开发的技能,特别是对于企业事务管理系统的具体实现。注意...

    Java Web项目加入Spring框架

    在Java Web开发中,Spring框架是一个非常重要的工具,它提供了全面的编程和配置模型,旨在简化应用程序的创建和维护。本篇文章将详细讲解如何将Spring框架整合到一个Java Web项目中,适合初学者入门。 首先,理解...

    Java Web SSH框架搭建小案例

    通过这个小案例,开发者可以学习到如何在实际项目中整合这三个框架,理解它们之间的协作方式,为构建更复杂的Java Web应用打下基础。同时,这也是一个很好的练习,有助于提升对MVC模式、依赖注入和数据库操作的理解...

    商贸项目SSH框架实现代码

    总结,这个商贸项目提供的SSH框架实现代码是一个宝贵的教育资源,可以帮助开发者深入理解SSH框架的实战应用,提升Java Web开发技能。通过分析和实践,不仅可以掌握SSH框架的精髓,还能提高解决实际问题的能力。

    spring ioc+mvc代码

    在实现中,我们可以创建一个`ApplicationContext`类作为容器,它负责读取配置文件(如XML或Java注解),解析并生成bean的定义。 1.2 Bean的定义与实例化 bean的定义通常包含类名、属性和依赖关系。我们可以通过`...

    自己动手做框架——ORM,MVC,IOC框架

    Spring框架是Java中最著名的IOC/DI实现,它允许开发者通过配置文件或注解来声明对象及其依赖。 在实际操作中,你可以通过以下步骤动手制作这些框架: 1. 设计ORM框架:定义接口或抽象类,用于表示数据库操作,然后...

    Java web项目—网上商城项目

    【Java Web项目—网上商城项目】是一个典型的Java后端技术与Web前端技术相结合的应用实例,主要采用了SSH(Struts2、Hibernate、Spring)三大框架进行开发。SSH框架因其高效、灵活和可扩展性,在企业级应用开发中...

    web的java代码

    本压缩包中的内容主要涉及使用Java进行Web开发的相关代码,包括与数据库交互以及实现前端和后端的交互逻辑。下面将详细介绍这些知识点。 首先,Java在Web开发中通常采用Servlet技术来处理HTTP请求。Servlet是Java...

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

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

    基于SSM框架的web项目

    这个项目是一个基于SSM框架的Web应用实例,通过整合这三个框架,实现了数据访问、业务逻辑处理以及用户界面的交互。 首先,Spring作为核心容器,管理着应用中的对象及其依赖关系。它提供了一个IOC(Inversion of ...

    基于SSH框架的web项目

    SSH框架组合在Java Web开发中广泛使用,提供了模型-视图-控制器(MVC)的设计模式,便于实现业务逻辑与界面展示的分离,提高代码的可维护性和可扩展性。 Struts2作为 MVC 框架,负责处理HTTP请求,控制应用的流程,...

    Java三大框架代码

    Java三大框架,包括Struts 2、Spring和Hibernate,是Java Web开发中广泛使用的集成框架,它们极大地简化了企业级应用程序的开发流程,提高了代码的可维护性和复用性。以下将详细介绍这三个框架的核心概念、功能及...

    自己动手实现IOC和MVC源码

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

    《架构探险 从零开始写javaweb框架》 源代码

    然后基于传统 Servlet 框架搭建一款轻量级 Java Web 框架,一切都是从零开始,逐个实现类加载器、Bean 容器、IoC 框架、MVC 框架,所涉及的代码也是整个框架的核心基础。为了使框架具备 AOP 特性,从代理技术讲到 ...

    Android 社交App+java web后台整套源代码

    在本资源中,我们拥有一套完整的Android社交应用与Java Web后台系统的源代码,这为开发者提供了一个绝佳的学习和实践平台。这套源代码是基于Android Studio和MyEclipse开发的,涵盖了客户端应用和服务器端服务的全部...

    Java Web项目开发案例精粹(源码)1_10章

    3. **源码分析与实践**:每个章节的源码文件(如ch01到ch10)代表了一个特定主题的实现,学习者可以通过阅读和运行这些代码来加深对Java Web开发的理解。每个子目录可能包含Java类、配置文件、JSP页面和其他相关资源...

Global site tag (gtag.js) - Google Analytics