不使用框架,如何实现依赖注入
如题!
求教,谁给说说!
或者发个demo也行,先谢谢了.
[解决办法]
那就使用自定义框架吧
http://download.csdn.net/detail/s478853630/4263505
试试看
[解决办法]
http://syue.com/Software/JAVA/15753.html
http://only1.iteye.com/blog/733550
百度一下,很多的。
[解决办法]
[解决办法]
你下载了别人的资源都还没评论的吧
伸出你那温柔的双手评论一下吧,就有分了。
我的邮箱只有2M的空间,网易很小气啊,没办法咯
[解决办法]
去看看spring注解的源代码,看懂了,就会写了。spring底层也是通过反射实现ioc的。
[解决办法]
[解决办法]
片段代码:
package com.org.mvc2.web;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Timer;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.org.mvc2.entity.JdbcConfig;
import com.org.mvc2.entity.ModelBean;
import com.org.mvc2.entity.Settled;
import com.org.mvc2.exciption.MvcException;
import com.org.mvc2.model.CacheIdTimer;
import com.org.mvc2.util.ReflectUtil;
/**
* 自定义框架的核心ModelBean和Control
* @version 2.0
* */
public class Mvc2BeanControlServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* 初始化
* @throws ServletException
* */
public void init() throws ServletException {
String config = getInitParameter(Settled.BEAN_CONTROL_CONFIG);
if (null != config && !"".equals(config)) {
String[] configPath = config.split(",");
for (int i = 0; i < configPath.length; i++) {
if (configPath[i].indexOf("classes") != -1) {
configPath[i] = configPath[i].substring(configPath[i].lastIndexOf("classes") + 8);
}
}
loadConfig(configPath, ReflectUtil.getClasspath());
Long interval = 1000l * 60l * 4l;
new Timer().schedule(new CacheIdTimer(), interval, interval);// 四分钟执行一次
}
}
/**
* 加载配置文件
* @param configPath 配置文件路径,多个文件用数组
* @param basePath class的根目录
* */
@SuppressWarnings("unchecked")
public void loadConfig(String[] configPath, String basePath) {
try {
List<String> packageList = new ArrayList<String>();
if (null != configPath && configPath.length > 0) {
for (int i = 0; i < configPath.length; i++) {
File file = new File(basePath + configPath[i]);
if (!file.exists()) {
throw new MvcException("找不到[" + configPath[i] + "]这个配置文件!");
}
Element root = new SAXReader().read(file).getRootElement();// 根节点
Iterator iterator = root.elements().iterator();
while (iterator.hasNext()) {
Element element = (Element) iterator.next();
if ("context".equals(element.getName())) {
String basePackage = element.attributeValue("basePackage");
if (null == basePackage || "".equals(basePackage)) {
throw new MvcException("配置文件[" + configPath[i] + "]中的context节点必须配置basePackage属性");
}
if (packageList.contains(basePackage)) {
throw new MvcException("多个context节点不能使用相同的basePackage属性值");
}
packageList.add(basePackage);
} else if ("bean".equals(element.getName())) {
String beanName = element.attributeValue("name");
String className = element.attributeValue("class");
if (null == beanName || null == className || "".equals(beanName) || "".equals(className)) {
throw new MvcException("配置文件[" + configPath[i] + "]中的bean节点必须配置name属性和class属性");
}
if (Settled.MODEL_BEAN_CONFIG_MAP.keySet().contains(beanName)) {
throw new MvcException("名称为[" + beanName + "]的javabean已经存在,不能重复设置");
}
ModelBean bean = new ModelBean();
bean.setName(beanName);
bean.setClassName(className);
Object object = Class.forName(className).newInstance();
if (Settled.JDBC_CONFIG_CLASS.equals(className)) {
bean.setObject(ModelBeanWeb.getWeb().loadJdbcProperty(configPath[i], object, element.elementIterator()));
Settled.JDBC_CONFIG_BEAN_MAP.put(beanName, bean);
} else {
bean.setObject(ModelBeanWeb.getWeb().loadProperty(configPath[i], object, element.elementIterator()));
}
Settled.MODEL_BEAN_CONFIG_MAP.put(beanName, bean);
} else {
throw new MvcException("配置文件[" + configPath[i] + "]中有不能解析的配置<" + element.getName() + "/>");
}
}
}
}
ModelBeanWeb.getWeb().loadPackageBean(packageList);
ModelBeanWeb.getWeb().loadForeignObject();
System.out.print("load succeed jdbcEntitys: [");
for (String str : Settled.JDBC_CONFIG_BEAN_MAP.keySet()) {
JdbcConfig config = (JdbcConfig) Settled.JDBC_CONFIG_BEAN_MAP.get(str).getObject();
for (String s : config.getEntityMap().keySet()) {
System.out.print(s + " ");
}
}
System.out.println("]");
System.out.print("load succeed beans: [");
for (String str : Settled.MODEL_BEAN_CONFIG_MAP.keySet()) {
System.out.print(str + " ");
}
for (String str : Settled.MODEL_BEAN_CODE_MAP.keySet()) {
System.out.print(str + " ");
}
System.out.println("]");
System.out.print("load succeed actions: [");
for (String str : Settled.ACTION_MAP.keySet()) {
System.out.print(str + " ");
}
System.out.println("]");
} catch (Exception e) {
e.printStackTrace();}
}
/**
* get提交
* @param request
* @param response
* @throws ServletException, IOException
* */
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ControlActionWeb.getWeb().execute(request, response);
}
/**
* post提交
* @param request
* @param response
* @throws ServletException, IOException
* */
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ControlActionWeb.getWeb().execute(request, response);
}
}
[解决办法]
依赖注入的三种方式,接口注入,构造器注入,get/set方法注入。按原理做就可以了。
[解决办法]
反射创建实例后,强制转换成接口声明的类就行了,什么框架也不用。
[解决办法]
通过反射机制。。只要知道类名和包名,就可以new出一个对象出来。。
[解决办法]
自定义一个ClassPathXmlApplicationContext,在这个类里面通过dom解析xml获取对应节点的id和class,然后通过反射生成对象,把生成的对象都放到map里面去,key是id,value是生成的对象,再获取property的id和class,设置关系。
[解决办法]
property是name和ref.