`
whoosh
  • 浏览: 232120 次
  • 性别: 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的反射机制。向你学习了。

相关推荐

    架构探险——从零开始写Java Web框架 绝对完整!强烈推荐

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

    Java高手真经_应用框架卷_Java_Web核心框架.part1.rar

    书首先分析了java web应用的分层设计方法,并进行应用框架的选型,然后讲解各种java web应用框架、集成技术、实战开发。主要内容包括如下。.  持久层框架hibernate:讲解hibernate入门与核心技术,分别实现mysql、...

    架构探险――从零开始写Java Web框架_黄勇

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

    ioc框架实现

    代码实现Spring IOC的功能可以前台跳转servlet,注入Service dao 实体类,实现set注入的功能。前后台页面都有。

    架构探险:从零开始写Java Web框架

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

    架构探险:从零开始写JAVA_WEB框架

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

    高效,小巧的开源JAVA WEB 开发框架-Nutz (源码,开发文档)

    不依赖任何第三方 Jar 包,从而便于程序员建立开发环境,部署,甚至重新编译 Nutz 的源代码。 不幸的是在第一版,我还是依赖了 Javassist 可以很好的和各种主流框架和类库等协同工作 你可以组合 Nutz.Dao + Spring ...

    Java Web 整合开发和项目实践(SSH)

    本书详细介绍了JavaWeb开发中的三大开发框架Struts、Hibernate与Spring的整合使用。本书内容由浅入深,循序渐进,理论讲解与实践相结合,并列举了大量典型应用实例帮助读者理解开发过程中的重点和难点知识,同时提供...

    架构探险-从零开始写javaweb框架

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

    完整版Java web开发教程PPT课件 Java开发进阶教程 第13章 spring ioc aop(共18页).pptx

    完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx 完整版Java web开发教程PPT课件 Java开发...

    Java高手真经_应用框架卷_Java_Web核心框架.part3.rar

    书首先分析了java web应用的分层设计方法,并进行应用框架的选型,然后讲解各种java web应用框架、集成技术、实战开发。主要内容包括如下。.  持久层框架hibernate:讲解hibernate入门与核心技术,分别实现mysql、...

    Java高手真经_应用框架卷_Java_Web核心框架.part2.rar

    书首先分析了java web应用的分层设计方法,并进行应用框架的选型,然后讲解各种java web应用框架、集成技术、实战开发。主要内容包括如下。.  持久层框架hibernate:讲解hibernate入门与核心技术,分别实现mysql、...

    基于java ssh框架实现机票订购管理系统v2附数据库文件+文档说明

    Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于J2EE应用程序之中,也可以应用于桌面应用程序...

    架构探险——从零开始写Java Web框架高清带书签pdf

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

    轻量级 Java Web 框架

    使用 Java 注解取代 XML 配置 使应用充分做到“前后端分离” 客户端可使用 HTML 或 JSP 作为视图模板 服务端可发布 REST 服务(使用 REST 插件) 客户端通过 AJAX 获取服务端数据并进行界面渲染 提高应用程序的开发...

    架构探险 从零开始写javaweb框架

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

    基于java SSM框架实现博客管理系统附数据库文件+文档说明

    Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于J2EE应用程序之中,也可以应用于桌面应用程序...

    架构探险 从零开始写javaweb框架 高清pdf 书签版

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

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

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

    Java Web程序设计教程

    &lt;&lt;Java Web程序设计教程.pdf&gt;&gt;人民邮电出版社的教程哦,所以,好书,你懂的!! 第1章web应用开发简介 1 1.1何为web应用 1 1.1.1web的概念及发展 1 1.1.2web应用程序 2 1.2使用java开发web应用 3 1.2.1面向对象...

Global site tag (gtag.js) - Google Analytics