dreamvc框架(一)ioc容器的集成

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介:

我的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,如需转载请自行联系原作者
相关文章
|
3天前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
3天前
|
XML Java 数据格式
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
这篇文章是Spring5框架的实战教程,主题是IOC容器中Bean的集合属性注入,通过XML配置方式。文章详细讲解了如何在Spring中注入数组、List、Map和Set类型的集合属性,并提供了相应的XML配置示例和Java类定义。此外,还介绍了如何在集合中注入对象类型值,以及如何使用Spring的util命名空间来实现集合的复用。最后,通过测试代码和结果展示了注入效果。
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
|
3天前
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
|
3天前
|
XML Java 数据格式
Spring5入门到实战------5、IOC容器-Bean管理(三)
这篇文章深入探讨了Spring5框架中IOC容器的高级Bean管理,包括FactoryBean的使用、Bean作用域的设置、Bean生命周期的详细解释以及Bean后置处理器的实现和应用。
Spring5入门到实战------5、IOC容器-Bean管理(三)
|
3天前
|
XML Java 数据格式
Spring5入门到实战------3、IOC容器-Bean管理XML方式(一)
这篇文章详细介绍了Spring框架中IOC容器的Bean管理,特别是基于XML配置方式的实现。文章涵盖了Bean的定义、属性注入、使用set方法和构造函数注入,以及如何注入不同类型的属性,包括null值、特殊字符和外部bean。此外,还探讨了内部bean的概念及其与外部bean的比较,并提供了相应的示例代码和测试结果。
Spring5入门到实战------3、IOC容器-Bean管理XML方式(一)
|
3天前
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
Spring5入门到实战------8、IOC容器-Bean管理注解方式
|
3天前
|
XML Java 数据格式
Spring5入门到实战------2、IOC容器底层原理
这篇文章深入探讨了Spring5框架中的IOC容器,包括IOC的概念、底层原理、以及BeanFactory接口和ApplicationContext接口的介绍。文章通过图解和实例代码,解释了IOC如何通过工厂模式和反射机制实现对象的创建和管理,以及如何降低代码耦合度,提高开发效率。
Spring5入门到实战------2、IOC容器底层原理
|
8天前
|
Docker 容器
Docker cp 将宿主机上的文件复制到容器中
Docker cp 将宿主机上的文件复制到容器中
10 0
|
3天前
|
JSON JavaScript 开发者
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
【8月更文挑战第7天】Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
|
5天前
|
监控 Ubuntu Docker
如何在Docker容器启动时自动运行脚本
【8月更文挑战第13天】在Docker容器启动时自动运行脚本可通过以下方式实现:1) 使用`ENTRYPOINT`或`CMD`指令在Dockerfile中直接指定启动脚本,如`ENTRYPOINT [&quot;/startup.sh&quot;]`;2) 启动容器时通过`--entrypoint`参数指定脚本路径;3) 利用supervisor等进程管理工具自动启动与监控脚本,确保其稳定运行。确保脚本具有执行权限并正确设置依赖资源路径。