SpringIOC
什么是Java反射
就是正在运行,动态获取这个类的所有信息。
通过反射机制可以访问Java对象的属性,方法,构造方法等。
反射机制的应用场景
什么是SpringIOC
spring ioc指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring容器统一进行管理,从而实现松耦合。
IOC实现原理
反射机制+XML读取解析技术
- 读取xml文件
- 获取xml文件中的bean配置信息
- 通过bean中的class值反射并实例化对象
- 通过反射api未私有属性赋值
SpringIOC模拟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
public class SpringIOCDemo {
public static void main(String[] args) throws Exception { User user = getBean("user"); System.out.println(user.toString()); }
private static User getBean(String beanId) throws Exception { SAXReader saxReader = new SAXReader(); Document document = saxReader.read(SpringIOCDemo.class.getClassLoader().getResourceAsStream("user.xml")); Element root = document.getRootElement(); List<Element> elements = root.elements(); Element beanElement = null; for (Element element : elements) { if (element.attributeValue("id").equals(beanId)) { beanElement = element; break; } }
if (beanElement != null) { Class clazz = Class.forName(beanElement.attributeValue("class")); Object obj = clazz.newInstance(); List<Element> propertys = beanElement.elements(); for (Element element : propertys) { String fieldName = element.attributeValue("name"); String fieldValue = element.attributeValue("value"); Field field = clazz.getDeclaredField(fieldName); field.setAccessible(true); if (field.getType() == Integer.class) { field.set(obj, Integer.parseInt(fieldValue)); } else if (field.getType() == String.class) { field.set(obj, fieldValue); } } return (User) obj; } return null; }
}
|