dreamvc框架(一)ioc容器的集成
我的dreamvc框架最终写得差点儿相同了,借鉴了非常多开源框架,SpringMVC、Struts2等,眼下放在github上面。地址请猛戳我
写得差点儿相同了,是要写一个总结,把自己当时的思路记录下来!还有很多其它的工作要做!
(一)
首先,IOC容器作为管理bean的重要工具,我们在日常的开发其中经经常使用到,最经常使用的就属SPRINGIOC了吧!当然,假设开发人员不原理是用SPRINGIOC。那么你能够实现自己的容器,或者是用其它的3方ioc工具。仅仅要实现dreamvc提供的IocFactory或者继承AbstractIocFactory。请看以下这个接口
package org.majorxie.dreamvc.ioc.factory; import java.util.List; import javax.servlet.ServletConfig;
import javax.servlet.ServletContext; /**
*IOC 容器 工厂接口
*
* @author xiezhaodong(majorxie@139.com)
*2014-10-24
*/
public interface IocFactory {
/**
* 载入容器
* @param config
*/
void init(ServletContext context); /**
* destory ioc
*/
void destroy(); /**
* 得到全部的controller对象
* @return
*/
List<Object> getControllers()throws Exception; /**
* 是否是拦截器
* @return
*/
List<Object> getInterceptors(); /**
* 得到其它对象
* @return
*/
List<Object> getOthers(); }
package org.majorxie.dreamvc.ioc.factory; import java.util.List; /**
* 假设是Spring容器就让他自己destory,其它的能够继承该类覆盖此方法
* 假设想要扩展ioc,则能够选择使用extends还是implements
* @author xiezhaodong
*2014-10-25
*/
public abstract class AbstractIocFactory implements IocFactory {
/**
* 默认实现为空
*/
public void destroy() { } public List<Object> getOthers() { return null;
} }
开发人员依照接口定义内容。封装好自己的controller和Interceptor。然后在web.xml里面配置实现类的路径即可了。dreamvc已经默认的实现了springioc。请看实现类
package org.majorxie.dreamvc.ioc.factory; import java.util.ArrayList;
import java.util.List; import javax.servlet.ServletContext; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.majorxie.dreamvc.exception.NotHaveControllerException;
import org.majorxie.dreamvc.interceptor.Interceptor;
import org.majorxie.dreamvc.tag.Controller;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils; /**
* Spring容器的实现,我们让spring去destory所以继承的abstract
*
* @author xiezhaodong 2014-10-25 01:34
*
*/
public class SpringIocFactory extends AbstractIocFactory {
private final Log log = LogFactory.getLog(SpringIocFactory.class); private ApplicationContext applicationContext;
private List<Object> controllerBeans = new ArrayList<Object>();
private List<Object> otherBeans = new ArrayList<Object>();
private List<Object> interceptorBeans = new ArrayList<Object>(); public void init(ServletContext context) {
log.info("init context...");
applicationContext = WebApplicationContextUtils
.getRequiredWebApplicationContext(context);
initBeans();
} public List<Object> getControllers() throws NotHaveControllerException { if (controllerBeans.size() == 0) {
throw new NotHaveControllerException("you need at least one controller ");
} else {
return controllerBeans;
}
} public List<Object> getInterceptors() {
return interceptorBeans;
} /**
* 假设是Interceptor或者controller类。或者有着两个的注解都算是该类的类
* 遍历全部的bean装载到list
*
*/
@SuppressWarnings("unchecked")
private void initBeans() {
String[] beanNames = applicationContext.getBeanDefinitionNames();
for (String beanName : beanNames) {
if (applicationContext.getBean(beanName) instanceof Interceptor/*||applicationContext.getType(beanName).isAnnotationPresent(org.majorxie.dreamvc.annotation.Interceptor.class)==true*/) {
// applicationContext.getBean(beanName, Interceptor.class);
interceptorBeans.add(applicationContext.getBean(beanName));
log.info("init interceptor..");
} else if (applicationContext.getBean(beanName) instanceof Controller||applicationContext.getType(beanName).isAnnotationPresent(org.majorxie.dreamvc.annotation.Controller.class)==true) {
controllerBeans.add(applicationContext.getBean(beanName));
log.info("init controller....");
} else {
otherBeans.add(applicationContext.getBean(beanName));
log.info("init others...");
} } } @Override
public List<Object> getOthers() { return otherBeans;
} }
配置web.xml载入參数
<init-param>
<param-name>container</param-name>
<param-value>org.majorxie.dreamvc.ioc.factory.SpringIocFactory</param-value>
</init-param>
ok,我们的ioc集成已经完毕了,如今就能够在application.xml配置了
<span style="white-space:pre"> </span><bean id="test" class="test.ConTest"></bean>
<bean id="inter2" class="test.Interceptor_02"></bean>
<bean id="inter" class="test.LoginInterceptor"></bean>
下一篇,会解说dreamvc的机制~~么么哒
转载请注明出处http://blog.csdn.net/a837199685
dreamvc框架(一)ioc容器的集成的更多相关文章
- Spring框架及IOC容器
Spring是一个非常活跃的开源框架, 它是一个基于IOC和AOP来构架多层JavaEE系统的框架,它的主要目地是简化企业开发.Spring以一种非侵入式的方式来管理你的代码, Spring提倡”最少 ...
- Spring框架 之IOC容器 和AOP详解
主要分析点: 一.Spring开源框架的简介 二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置 一.S ...
- 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
前言:在C/S架构上,WPF无疑已经是"桌面一霸"了.在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用.但是WPF也有很多年的历史了,并且基于MVVM ...
- 基于nutz框架理解Ioc容器
同样我们从问题入手去验证以及去理解Ioc容器都做了哪些事情: 1.nutz是有几种方式获取需要容器管理bean的信息? 第一种是使用json格式的文件进行配置,如: 第二种:使用注解@IocBean ...
- Spring框架学习[IoC容器高级特性]
1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取 ...
- ASP.NET Web API 框架研究 IoC容器 DependencyResolver
一.概念 1.IoC(Inversion of Control),控制反转 即将依赖对象的创建和维护交给一个外部容器来负责,而不是应用本身.如,在类型A中需要使用类型B的实例,而B的实例的创建不是由A ...
- spring-framework-中文文档一:IoC容器、介绍Spring IoC容器和bean
5. IoC容器 5.1介绍Spring IoC容器和bean 5.2容器概述 本章介绍Spring Framework实现控制反转(IoC)[1]原理.IoC也被称为依赖注入(DI).它是一个过程, ...
- Spring IoC容器总结(未完)
在面向对象系统中,对象封装了数据和对数据的处理,对象的依赖关系常常体现在对数据和方法的依赖上.这些依赖关系可以通过把对象的依赖注入交给框架或IOC容器来完成,这种从具体对象手中交出控制的做法是非常有价 ...
- Spring IOC容器的实现原理
1 概述 1.1 依赖反转模式 在Java中,一个复杂的功能一般都需要由两个或者两个以上的类通过彼此合作来实现业务逻辑的,这使得每个对象都需要与其合作的对象的引用.如果这个获取依赖对象的过程需要自己去 ...
随机推荐
- etTimeout与setInterval方法的区别
etTimeout与setInterval方法的区别 setTimeout()用于设定在指定的时间之后执行对应的函数或代码.,在全局作用域下执行 setTimeout(code,time[,args… ...
- Jquery OR Js 实现图片预览
Jquery方法一: <!DOCTYPE html> <html> <head> <title></title> <s ...
- Python核心编程2第四章课后练习
4-1 Python 对象.与所有 Python 对象有关的三个属性是什么?请简单的描述一下. 身份:对象的唯一标识 类型 :对象的类型决定了该对象可以保存什么类型的值 ...
- js将数字转换成大写的人民币表达式
function changeNumMoneyToChinese(money) { var cnNums = new Array("零", "壹", " ...
- linux RWT
http://www.cnblogs.com/qlwy/archive/2011/06/26/2121919.html#undefined
- KeilC51高级编程
第一节 绝对地址访问 C51提供了三种访问绝对地址的方法: 1. 绝对宏: 在程序中,用“#include<absacc.h>”即可使用其中定义的宏来访问绝对地址,包括: CBYTE.XB ...
- synchronize的心得
记录一下synchronize(this).synchronize(A.class).private B b= new B(); synchronize(b) .synchronize static ...
- Android与服务器端数据交互(http协议整合struts2+android)
在android中有时候我们不需要用到本机的SQLite数据库提供数据,更多的时候是从网络上获取数据,那么Android怎么从服务器端获取数据呢?有很多种,归纳起来有 一:基于Http协议获取数据方法 ...
- 凯撒密码 CH Round #57 - Story of the OI Class
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2357%20-%20Story%20of%20the%20OI%20Class/凯撒密码 题解:刚开始想map, ...
- Linux Shell编程(15)——操作字符串
Bash已经支持了令人惊讶的字符串操作的数量.不幸地,这些工具缺乏统一的标准.一些是参数替换的子集,其它受到UNIX的expr命令的功能的影响.这导致不一致的命令语法和冗余的功能,但这些并没有引起混乱 ...