一: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);
}
}
分享到:
相关推荐
然后基于传统 Servlet 框架搭建一款轻量级 Java Web 框架,一切都是从零开始,逐个实现类加载器、Bean容器、IoC框架、MVC框架,所涉及的代码也是整个框架的核心基础。为了使框架具备AOP特性,从代理技术讲到 AOP ...
书首先分析了java web应用的分层设计方法,并进行应用框架的选型,然后讲解各种java web应用框架、集成技术、实战开发。主要内容包括如下。. 持久层框架hibernate:讲解hibernate入门与核心技术,分别实现mysql、...
然后基于传统 Servlet 框架搭建一款轻量级 Java Web 框架,一切都是从零开始,逐个实现类加载器、Bean 容器、IoC 框架、MVC 框架,所涉及的代码也是整个框架的核心基础。为了使框架具备 AOP 特性,从代理技术讲到 ...
代码实现Spring IOC的功能可以前台跳转servlet,注入Service dao 实体类,实现set注入的功能。前后台页面都有。
然后基于传统 Servlet 框架搭建一款轻量级 Java Web 框架,一切都是从零开始,逐个实现类加载器、Bean 容器、IoC 框架、MVC 框架,所涉及的代码也是整个框架的核心基础。为了使框架具备 AOP 特性,从代理技术讲到 ...
然后基于传统 Servlet 框架搭建一款轻量级 Java Web 框架,一切都是从零开始,逐个实现类加载器、Bean容器、IoC框架、MVC 框架,所涉及的代码也是整个框架的核心基础。为了使框架具备 AOP 特性,从代理技术讲到 AOP ...
不依赖任何第三方 Jar 包,从而便于程序员建立开发环境,部署,甚至重新编译 Nutz 的源代码。 不幸的是在第一版,我还是依赖了 Javassist 可以很好的和各种主流框架和类库等协同工作 你可以组合 Nutz.Dao + Spring ...
本书详细介绍了JavaWeb开发中的三大开发框架Struts、Hibernate与Spring的整合使用。本书内容由浅入深,循序渐进,理论讲解与实践相结合,并列举了大量典型应用实例帮助读者理解开发过程中的重点和难点知识,同时提供...
然后基于传统 Servlet 框架搭建一款轻量级 Java Web 框架,一切都是从零开始,逐个实现类加载器、Bean 容器、IoC 框架、MVC 框架,所涉及的代码也是整个框架的核心基础。为了使框架具备 AOP 特性,从代理技术讲到 ...
完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx 完整版Java web开发教程PPT课件 Java开发...
书首先分析了java web应用的分层设计方法,并进行应用框架的选型,然后讲解各种java web应用框架、集成技术、实战开发。主要内容包括如下。. 持久层框架hibernate:讲解hibernate入门与核心技术,分别实现mysql、...
书首先分析了java web应用的分层设计方法,并进行应用框架的选型,然后讲解各种java web应用框架、集成技术、实战开发。主要内容包括如下。. 持久层框架hibernate:讲解hibernate入门与核心技术,分别实现mysql、...
Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于J2EE应用程序之中,也可以应用于桌面应用程序...
然后基于传统 Servlet 框架搭建一款轻量级 Java Web 框架,一切都是从零开始,逐个实现类加载器、Bean 容器、IoC 框架、MVC 框架,所涉及的代码也是整个框架的核心基础。为了使框架具备 AOP 特性,从代理技术讲到 ...
使用 Java 注解取代 XML 配置 使应用充分做到“前后端分离” 客户端可使用 HTML 或 JSP 作为视图模板 服务端可发布 REST 服务(使用 REST 插件) 客户端通过 AJAX 获取服务端数据并进行界面渲染 提高应用程序的开发...
然后基于传统 Servlet 框架搭建一款轻量级 Java Web 框架,一切都是从零开始,逐个实现类加载器、Bean 容器、IoC 框架、MVC 框架,所涉及的代码也是整个框架的核心基础。为了使框架具备 AOP 特性,从代理技术讲到 ...
Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于J2EE应用程序之中,也可以应用于桌面应用程序...
然后基于传统 Servlet 框架搭建一款轻量级 Java Web 框架,一切都是从零开始,逐个实现类加载器、Bean 容器、IoC 框架、MVC 框架,所涉及的代码也是整个框架的核心基础。为了使框架具备 AOP 特性,从代理技术讲到 ...
然后基于传统 Servlet 框架搭建一款轻量级 Java Web 框架,一切都是从零开始,逐个实现类加载器、Bean 容器、IoC 框架、MVC 框架,所涉及的代码也是整个框架的核心基础。为了使框架具备 AOP 特性,从代理技术讲到 ...
<<Java Web程序设计教程.pdf>>人民邮电出版社的教程哦,所以,好书,你懂的!! 第1章web应用开发简介 1 1.1何为web应用 1 1.1.1web的概念及发展 1 1.1.2web应用程序 2 1.2使用java开发web应用 3 1.2.1面向对象...