package com.spring.test;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;
public class MySpring {
List<BeanDefinition> beanDefines=new ArrayList<BeanDefinition>();
Map<String, Object> map=new HashMap<String, Object>();
public MySpring(String filename){
//读取XML文件,遍历bean,存放到List
readXML(filename);
//遍历bean集合,利用反射实例化bean,存放到Map
instanceBean();
//依赖注入
injectObject();
//注解注入
annotationInject();
}
private void annotationInject() {
for(String name : map.keySet()){
Object bean=map.get(name);
if(bean!=null){
try {
PropertyDescriptor[] ps=Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
for(PropertyDescriptor propertyDescriptor : ps){
Method setter=propertyDescriptor.getWriteMethod();//获取setter方法
//判断注解是否存在
if(setter!=null && setter.isAnnotationPresent(MyResource.class)){
MyResource myResource=setter.getAnnotation(MyResource.class);
Object value=null;
//声明name属性
if(myResource.name()!=null && !"".equals(myResource.name())){
value=map.get(myResource.name());
}else{
value=map.get(propertyDescriptor.getName());
if(value==null){
for(String key : map.keySet()){
if(propertyDescriptor.getPropertyType().isAssignableFrom(map.get(key).getClass())){
value=map.get(key);
break;
}
}
}
}
setter.setAccessible(true);
setter.invoke(bean, value);//把引用对象注入到属性中
}
}
//字段
Field[] fields=bean.getClass().getFields();
for(Field field : fields){
if(field.isAnnotationPresent(MyResource.class)){
MyResource myResource=field.getAnnotation(MyResource.class);
Object value=null;
//声明name属性
if(myResource.name()!=null && !"".equals(myResource.name())){
value=map.get(myResource.name());
}else{
value=map.get(field.getName());
if(value==null){
for(String key : map.keySet()){
if(field.getType().isAssignableFrom(map.get(key).getClass())){
value=map.get(key);
break;
}
}
}
}
field.setAccessible(true);
field.set(bean,value);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
private void injectObject() {
//循环所有的bean节点
for(BeanDefinition beanDefinition : beanDefines){
Object bean= map.get(beanDefinition.getId());
if(bean!=null){
try {
PropertyDescriptor[] ps=Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
//循环所有的property节点
for(PropertyDefinition propertyDefinition : beanDefinition.getProperties()){
for(PropertyDescriptor propertyDescriptor : ps){
if(propertyDefinition.getName().equals(propertyDescriptor.getName())){
Method setter=propertyDescriptor.getWriteMethod();//获取setter方法
if(setter!=null){
Object value=map.get(propertyDefinition.getRef());
//如果private,设置允许访问
setter.setAccessible(true);
setter.invoke(bean, value);//把引用对象注入到属性中
}
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
@SuppressWarnings("unchecked")
private void readXML(String filename) {
SAXReader saxReader = new SAXReader();
Document document=null;
try{
URL xmlpath = this.getClass().getClassLoader().getResource(filename);
document = saxReader.read(xmlpath);
Map<String,String> nsMap = new HashMap<String,String>();
nsMap.put("ns","http://www.springframework.org/schema/beans");//加入命名空间
XPath xsub = document.createXPath("//ns:beans/ns:bean");//创建beans/bean查询路径
xsub.setNamespaceURIs(nsMap);//设置命名空间
List<Element> beans = xsub.selectNodes(document);//获取文档下所有bean节点
for(Element element : beans){
String id = element.attributeValue("id");//获取id属性值
String clazz = element.attributeValue("class"); //获取class属性值
BeanDefinition beanDefine = new BeanDefinition(id, clazz);
XPath propertysub = element.createXPath("ns:property");//创建beans/property查询路径
propertysub.setNamespaceURIs(nsMap);//设置命名空间
List<Element> propertys = propertysub.selectNodes(element);//获取文档下所有property节点
for(Element property : propertys){
String propertyName=property.attributeValue("name");
String propertyRef=property.attributeValue("ref");
System.out.println(propertyName+propertyRef);
PropertyDefinition pd=new PropertyDefinition(propertyName,propertyRef);
beanDefine.getProperties().add(pd);
}
beanDefines.add(beanDefine);
}
}catch(Exception e){
e.printStackTrace();
}
}
private void instanceBean() {
for(BeanDefinition bean : beanDefines){
try {
if(bean.getClassName()!=null && !"".equals(bean.getClassName()))
//实例化Bean对象
map.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public Object getBean(String id){
return this.map.get(id);
}
}
分享到:
相关推荐
NULL 博文链接:https://slnddd.iteye.com/blog/1756411
spring 控制反转和依赖注入进行基础知识的生命周期、延迟初始化、装配方式等进行案例总结使用。从而对spring基础知识更加理解。
Spring 控制反转和依赖注入
Spring Ioc 注解 依赖注入
springIOC 小例子 附带源码 适合新手学习
spring 控制反转的模拟程序 直观 帮助大家学习spring 共享 不要分
自定义spring实现读取applicationContext.xml并依赖注入,可以参考学习控制反转的原理,非常简单。
模拟Spring IOC 自己实现依赖注入 自己的Spring 自己的代码模拟spring的依赖注入 自己写的 绝对独一无二
spring的控制反转和依赖注入详解
NULL 博文链接:https://zmx.iteye.com/blog/688299
通过java代码模拟spring的依赖注入
Spring依赖注入——java项目中使用spring注解方式进行注入.rar
javaEE 开发中 现在最成熟的框架之一应该就是spring了 spring框架最强大的地方就是实现了依赖注入 也叫控制反转 最近的一个项目中用的就是 spring框架 spring框架是工厂模式的应用结合了MVC的设计思想 大家可以...
spring 支持@RequestBody注解依赖包 、 spring 支持@RequestBody注解依赖包 spring 支持@RequestBody注解依赖包
揭秘spring核心机制, 模拟spring依赖注入
Spring注解所依赖的包。com.springSource.javax.annotation
此文档仅供初学者学习,包括Spring的依赖注入(控制反转)的详细实例。以三层贯穿实例(持久层、业务层、控制层),由MAIN方法直接调用测试用例。
Spring 三种依赖注入方式.doc Spring 三种依赖注入方式.doc
主要介绍了理解Spring中的依赖注入和控制反转,具有一定参考价值,需要的朋友可以了解下。
如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的 依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程(将依赖关系注入到对象中) ,spring的依赖注入有3种方式: ...