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





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5313291.html,如需转载请自行联系原作者
相关文章
|
5月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
人工智能 Kubernetes jenkins
容器化AI模型的持续集成与持续交付(CI/CD):自动化模型更新与部署
在前几篇文章中,我们探讨了容器化AI模型的部署、监控、弹性伸缩及安全防护。为加速模型迭代以适应新数据和业务需求,需实现容器化AI模型的持续集成与持续交付(CI/CD)。CI/CD通过自动化构建、测试和部署流程,提高模型更新速度和质量,降低部署风险,增强团队协作。使用Jenkins和Kubernetes可构建高效CI/CD流水线,自动化模型开发和部署,确保环境一致性并提升整体效率。
|
8月前
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
471 1
云原生信息提取系统:容器化流程与CI/CD集成实践
|
10月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
254 18
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
10月前
|
移动开发 Java 测试技术
HarmonyOS NEXT~鸿蒙系统与mPaaS三方框架集成指南
本文详细介绍了鸿蒙系统(HarmonyOS)与mPaaS框架的集成方法。鸿蒙系统作为华为开发的分布式操作系统,具备分布式架构、微内核设计等特性;mPaaS是蚂蚁金服推出的移动开发平台,提供金融级组件和全生命周期管理能力。文章从环境准备、核心功能集成(如初始化、用户认证、支付功能)、适配问题解决到调试测试及最佳实践,全方位指导开发者高效集成两者。通过遵循指南,可充分利用鸿蒙的特性和mPaaS的金融能力,构建高性能、高安全性的应用,同时避免常见兼容性问题,缩短开发周期。
518 0
|
人工智能 达摩院 并行计算
VideoRefer:阿里达摩院开源视频对象感知与推理框架,可集成 VLLM 提升其空间和时间理解能力
VideoRefer 是浙江大学与阿里达摩学院联合推出的视频对象感知与推理技术,支持细粒度视频对象理解、复杂关系分析及多模态交互,适用于视频剪辑、教育、安防等多个领域。
699 17
VideoRefer:阿里达摩院开源视频对象感知与推理框架,可集成 VLLM 提升其空间和时间理解能力
|
12月前
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
400 0
课时5:阿里云容器服务:最原生的集成Docker和云服务
|
消息中间件 人工智能 Kubernetes
解密开源Serverless容器框架:事件驱动篇
Knative是一款基于Kubernetes的开源Serverless框架,提供了云原生、跨平台的Serverless编排标准。作为Serverless中必不可少的事件驱动能力,Knative Eventing提供了云原生的事件驱动能力。
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
438 2