package com.kele.ioc;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.NoSuchMessageException;
import org.springframework.core.ResolvableType;
import org.springframework.core.env.Environment;
import org.springframework.core.io.Resource;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
/**
* @Version 2019
* @Author:kele
* @Date:2021/6/6
* @Content:
* @Description:
*/
public class MyXmlApplicationContext implements ApplicationContext {
public Map<String,Object> iocMap;
public MyXmlApplicationContext(String path){
iocMap=new HashMap<>();
pareXml(path);
}
public void pareXml(String path) {
SAXReader saxReader=new SAXReader();
try {
Document document = saxReader.read("src/main/resources/"+path);
//获得根节点节点
Element rootElement = document.getRootElement();
//通过根节点迭代到第一层也就是bean标签
Iterator<Element> rootIter = rootElement.elementIterator();
while (rootIter.hasNext()){
//获得bean标签
Element bean = rootIter.next();
//获得bean标签的id
String idStr=bean.attributeValue("id");
//获得bean标签的class
String className=bean.attributeValue("class");
//通过classname利用反射创建对象
Class clazz=Class.forName(className);
//或的无参构造
Constructor constructor = clazz.getConstructor();
//通过无参构造创建对象
Object object = constructor.newInstance();
//给属性赋值了
//通过bean在再迭代出里面的property
Iterator<Element> beanIter = bean.elementIterator();
while (beanIter.hasNext()){
//或的property标签
Element property=beanIter.next();
String propertyName=property.attributeValue("name");
String propertyValue=property.attributeValue("value");
//属性赋值使用的是setter方法
//所以要转换一下格式类型
String methodName="set"+propertyName.substring(0,1).toUpperCase()+propertyName.substring(1);
//或的类中的属性值和他们的类型
Field field = clazz.getDeclaredField(propertyName);
//获得方法
Method method=clazz.getMethod(methodName,field.getType());
//类型转换
Object value=propertyValue;
switch (field.getType().getName()){
case "java.lang.Integer":
value=Integer.parseInt(propertyValue);
break;
case "java.lang.Double":
value=Double.parseDouble(propertyValue);
break;
}
//调用invoke赋值
method.invoke(object,value);
}
iocMap.put(idStr,object);
}
} catch (DocumentException | ClassNotFoundException | NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
@Override
public String getId() {
return null;
}
@Override
public String getApplicationName() {
return null;
}
@Override
public String getDisplayName() {
return null;
}
@Override
public long getStartupDate() {
return 0;
}
@Override
public ApplicationContext getParent() {
return null;
}
@Override
public AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException {
return null;
}
@Override
public BeanFactory getParentBeanFactory() {
return null;
}
@Override
public boolean containsLocalBean(String s) {
return false;
}
@Override
public boolean containsBeanDefinition(String s) {
return false;
}
@Override
public int getBeanDefinitionCount() {
return 0;
}
@Override
public String[] getBeanDefinitionNames() {
return new String[0];
}
@Override
public <T> ObjectProvider<T> getBeanProvider(Class<T> aClass, boolean b) {
return null;
}
@Override
public <T> ObjectProvider<T> getBeanProvider(ResolvableType resolvableType, boolean b) {
return null;
}
@Override
public String[] getBeanNamesForType(ResolvableType resolvableType) {
return new String[0];
}
@Override
public String[] getBeanNamesForType(ResolvableType resolvableType, boolean b, boolean b1) {
return new String[0];
}
@Override
public String[] getBeanNamesForType(Class<?> aClass) {
return new String[0];
}
@Override
public String[] getBeanNamesForType(Class<?> aClass, boolean b, boolean b1) {
return new String[0];
}
@Override
public <T> Map<String, T> getBeansOfType(Class<T> aClass) throws BeansException {
return null;
}
@Override
public <T> Map<String, T> getBeansOfType(Class<T> aClass, boolean b, boolean b1) throws BeansException {
return null;
}
@Override
public String[] getBeanNamesForAnnotation(Class<? extends Annotation> aClass) {
return new String[0];
}
@Override
public Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> aClass) throws BeansException {
return null;
}
@Override
public <A extends Annotation> A findAnnotationOnBean(String s, Class<A> aClass) throws NoSuchBeanDefinitionException {
return null;
}
@Override
public Object getBean(String s) throws BeansException {
return iocMap.get(s);
}
@Override
public <T> T getBean(String s, Class<T> aClass) throws BeansException {
return null;
}
@Override
public Object getBean(String s, Object... objects) throws BeansException {
return null;
}
@Override
public <T> T getBean(Class<T> aClass) throws BeansException {
return null;
}
@Override
public <T> T getBean(Class<T> aClass, Object... objects) throws BeansException {
return null;
}
@Override
public <T> ObjectProvider<T> getBeanProvider(Class<T> aClass) {
return null;
}
@Override
public <T> ObjectProvider<T> getBeanProvider(ResolvableType resolvableType) {
return null;
}
@Override
public boolean containsBean(String s) {
return false;
}
@Override
public boolean isSingleton(String s) throws NoSuchBeanDefinitionException {
return false;
没有合适的资源?快使用搜索试试~ 我知道了~
springIOC及AOP底层原理Demo实现
共92个文件
class:28个
java:21个
xml:15个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 191 浏览量
2023-11-13
10:20:38
上传
评论
收藏 8.44MB ZIP 举报
温馨提示
实现spring框架中两大思想: 1.ioc 2.aop 分析实现原理自己实现ioc和aop。
资源推荐
资源详情
资源评论
收起资源包目录
iocAndaop-master.zip (92个子文件)
iocAndaop-master
pom.xml 6KB
src
main
resources
springmvc.xml 1KB
spring-ioc.xml 1KB
spring-aop.xml 1011B
bean.properties 21B
java
com
kele
repository
CourseRepository.java 1KB
controller
RESTController.java 900B
HelloController.java 1KB
CourseController.java 2KB
cal
Cal.java 297B
impl
CalImpl.java 737B
log
LoggerAspect.java 1KB
entity
Course.java 353B
Address.java 220B
Car.java 267B
User.java 315B
aop
AopTest.java 854B
MyInvocationHandler.java 1014B
ioc
MyXmlApplicationContext.java 9KB
Test.java 732B
ref
MyValue.java 400B
RefTest.java 1KB
Cat.java 380B
RefTest2.java 2KB
MyComponent.java 402B
Dog.java 212B
webapp
WEB-INF
web.xml 1KB
index.jsp 1KB
edit.jsp 1KB
save.jsp 1010B
add.jsp 1KB
test.jsp 447B
LICENSE 34KB
.idea
uiDesigner.xml 9KB
vcs.xml 180B
misc.xml 640B
compiler.xml 599B
encodings.xml 261B
target
classes
springmvc.xml 1KB
spring-ioc.xml 1KB
spring-aop.xml 1011B
bean.properties 21B
META-INF
springmvc_study.kotlin_module 16B
com
kele
repository
CourseRepository.class 2KB
controller
CourseController.class 2KB
HelloController.class 2KB
RESTController.class 1KB
cal
Cal.class 164B
impl
CalImpl.class 857B
log
LoggerAspect.class 2KB
entity
User.class 2KB
Address.class 2KB
Car.class 2KB
Course.class 2KB
aop
MyInvocationHandler.class 2KB
AopTest.class 973B
ioc
Test.class 912B
MyXmlApplicationContext.class 13KB
ref
Dog.class 2KB
MyValue.class 442B
Cat.class 2KB
MyComponent.class 449B
RefTest2.class 3KB
RefTest.class 2KB
springmvc_study
WEB-INF
classes
springmvc.xml 1KB
com
kele
repository
CourseRepository.class 2KB
controller
CourseController.class 2KB
HelloController.class 2KB
RESTController.class 1KB
entity
User.class 2KB
Address.class 2KB
Course.class 2KB
lib
spring-jcl-5.3.7.jar 23KB
spring-expression-5.3.7.jar 276KB
spring-aop-5.3.7.jar 366KB
spring-web-5.3.7.jar 1.52MB
lombok-1.18.20.jar 1.84MB
spring-context-5.3.7.jar 1.19MB
jstl-impl-1.2.jar 383KB
fastjson-1.2.76.jar 643KB
spring-webmvc-5.3.7.jar 983KB
spring-beans-5.3.7.jar 680KB
spring-core-5.3.7.jar 1.39MB
jstl-api-1.2.jar 30KB
web.xml 1KB
index.jsp 1KB
edit.jsp 1KB
save.jsp 1010B
add.jsp 1KB
META-INF
MANIFEST.MF 87B
test.jsp 447B
springmvc_study.iml 80B
共 92 条
- 1
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6651
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功