一: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);
}
}
分享到:
相关推荐
总结来说,"ioc框架实现"是关于使用Spring框架的IOC功能来构建一个包含Controller、Service、DAO三层架构的Web应用,通过setter注入实现组件间的依赖关系,并结合JSP进行视图展示。这样的设计模式提高了代码的可测试...
Java Web开发框架是用于构建动态、交互式的Web应用程序的强大工具,它简化了开发过程,提高了代码的可重用性和可维护性。本框架的核心目标是为开发者提供一套高效且易于学习的开发环境,以实现快速原型设计和项目...
在下载并解压提供的"javaSrc95.zip"文件后,可以通过阅读源代码和按照"下载及使用说明.txt"来学习和理解整个项目的架构和功能实现。这将有助于提升Java Web开发的技能,特别是对于企业事务管理系统的具体实现。注意...
在Java Web开发中,Spring框架是一个非常重要的工具,它提供了全面的编程和配置模型,旨在简化应用程序的创建和维护。本篇文章将详细讲解如何将Spring框架整合到一个Java Web项目中,适合初学者入门。 首先,理解...
通过这个小案例,开发者可以学习到如何在实际项目中整合这三个框架,理解它们之间的协作方式,为构建更复杂的Java Web应用打下基础。同时,这也是一个很好的练习,有助于提升对MVC模式、依赖注入和数据库操作的理解...
总结,这个商贸项目提供的SSH框架实现代码是一个宝贵的教育资源,可以帮助开发者深入理解SSH框架的实战应用,提升Java Web开发技能。通过分析和实践,不仅可以掌握SSH框架的精髓,还能提高解决实际问题的能力。
在实现中,我们可以创建一个`ApplicationContext`类作为容器,它负责读取配置文件(如XML或Java注解),解析并生成bean的定义。 1.2 Bean的定义与实例化 bean的定义通常包含类名、属性和依赖关系。我们可以通过`...
Spring框架是Java中最著名的IOC/DI实现,它允许开发者通过配置文件或注解来声明对象及其依赖。 在实际操作中,你可以通过以下步骤动手制作这些框架: 1. 设计ORM框架:定义接口或抽象类,用于表示数据库操作,然后...
【Java Web项目—网上商城项目】是一个典型的Java后端技术与Web前端技术相结合的应用实例,主要采用了SSH(Struts2、Hibernate、Spring)三大框架进行开发。SSH框架因其高效、灵活和可扩展性,在企业级应用开发中...
本压缩包中的内容主要涉及使用Java进行Web开发的相关代码,包括与数据库交互以及实现前端和后端的交互逻辑。下面将详细介绍这些知识点。 首先,Java在Web开发中通常采用Servlet技术来处理HTTP请求。Servlet是Java...
在本Java练习中,我们将深入理解并实现Spring框架的核心组件——IoC(Inversion of Control,控制反转)容器。这个练习分为三个主要部分,旨在帮助我们掌握XML配置文件的读取,模拟Spring的IoC机制,以及对Struts...
这个项目是一个基于SSM框架的Web应用实例,通过整合这三个框架,实现了数据访问、业务逻辑处理以及用户界面的交互。 首先,Spring作为核心容器,管理着应用中的对象及其依赖关系。它提供了一个IOC(Inversion of ...
SSH框架组合在Java Web开发中广泛使用,提供了模型-视图-控制器(MVC)的设计模式,便于实现业务逻辑与界面展示的分离,提高代码的可维护性和可扩展性。 Struts2作为 MVC 框架,负责处理HTTP请求,控制应用的流程,...
Java三大框架,包括Struts 2、Spring和Hibernate,是Java Web开发中广泛使用的集成框架,它们极大地简化了企业级应用程序的开发流程,提高了代码的可维护性和复用性。以下将详细介绍这三个框架的核心概念、功能及...
【标题】"自己动手实现IOC和MVC源码"揭示了本文的核心内容,即通过实践来理解并构建IoC(Inversion of Control)和MVC(Model-View-Controller)这两种重要的软件设计模式的源代码。这两者是现代Java Web开发中...
然后基于传统 Servlet 框架搭建一款轻量级 Java Web 框架,一切都是从零开始,逐个实现类加载器、Bean 容器、IoC 框架、MVC 框架,所涉及的代码也是整个框架的核心基础。为了使框架具备 AOP 特性,从代理技术讲到 ...
在本资源中,我们拥有一套完整的Android社交应用与Java Web后台系统的源代码,这为开发者提供了一个绝佳的学习和实践平台。这套源代码是基于Android Studio和MyEclipse开发的,涵盖了客户端应用和服务器端服务的全部...
3. **源码分析与实践**:每个章节的源码文件(如ch01到ch10)代表了一个特定主题的实现,学习者可以通过阅读和运行这些代码来加深对Java Web开发的理解。每个子目录可能包含Java类、配置文件、JSP页面和其他相关资源...