아 날로 그 Spring IOC
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="studentDao" class="com.zju.test.StudentDao"></bean>
<bean id="studentService" class="com.zju.test.StudentService" >
<property name="studentDao" ref="studentDao"/>
</bean>
</beans>
1. 데이터 구조의 정의:
Spring 에서 BeanDefinition 데이터 구조 로 데 이 터 를 밀봉 합 니 다.
BeanDefinition 클래스:
package com.zju.xiaoye.bean;
import java.util.ArrayList;
import java.util.List;
/**
* BeanDefinition
*
* @author xiaoye
*
*/
public class BeanDefinition {
private String id; //bean id
private String className; //bean className
private List<PropertyDefinition> properties = new ArrayList<PropertyDefinition>(); // bean property
public BeanDefinition(String id, String className) {
this.id = id;
this.className = className;
}
public BeanDefinition() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public List<PropertyDefinition> getProperties() {
return properties;
}
public void setProperties(List<PropertyDefinition> properties) {
this.properties = properties;
}
}
PropertyDefinition 의 정 의 는 다음 과 같다.
package com.zju.xiaoye.bean;
public class PropertyDefinition {
private String name; //name
private String ref; //ref
public PropertyDefinition(String name, String ref) {
this.name = name;
this.ref = ref;
}
public PropertyDefinition() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRef() {
return ref;
}
public void setRef(String ref) {
this.ref = ref;
}
}
2. 아 날로 그 용기 의 실현
아 날로 그 용기 류 MockSpringXmlApplication Context 의 주요 구 조 는 다음 과 같다.
package com.zju.xiaoye.context;
import ......
public class MockSpringXmlApplicationContext {
//BeanDefinition List
private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
// beanDefinitionMap
private Map<String, Object> beanDefinitionMap = new HashMap<String, Object>();
/**
* MockSpringXmlApplicationContext
* xml readXml(fileName);
* Beans initBeas();
* inject();
* @param fileName
*/
public MockSpringXmlApplicationContext(String fileName){
this.readXml(fileName);
this.initBeans();
this.inject();
}
/**
* xml
* bean beanDefines
* @param fileName
*/
private void readXml(String fileName){
.......
}
/**
* beanDefines bean map
*/
private void initBeans(){
......
}
/**
* set
* beanDefines , beanDefinition, property
*/
private void inject(){
......
}
/**
* id bean
* @param id
* @return
*/
public Object getBean(String id){
return beanDefinitionMap.get(id);
}
}
다음은 주요 한 방법 실현 을 소개 한다.
1) readXml (String fileName): dom4j 로 xml 파일 분석
private void readXml(String fileName){
SAXReader saxReader = new SAXReader();
Document document = null;
try {
document = saxReader.read(new File(fileName));
Element root = document.getRootElement();
for(Iterator rootIter = root.elementIterator("bean"); rootIter.hasNext();){
Element beanNode = (Element) rootIter.next();
BeanDefinition beanDefinition = new BeanDefinition(beanNode.attributeValue("id"), beanNode.attributeValue("class"));
for(Iterator beanIter = beanNode.elementIterator(); beanIter.hasNext();){
Element property = (Element) beanIter.next();
PropertyDefinition propertyDefinition = new PropertyDefinition(property.attributeValue("name"),property.attributeValue("ref"));
beanDefinition.getProperties().add(propertyDefinition);
}
beanDefines.add(beanDefinition);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2)initBeans()
private void initBeans(){
for(BeanDefinition bean : beanDefines){
if(bean.getClassName()!=null && !"".equals(bean.getClassName().trim())){
try {
beanDefinitionMap.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());//
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3)inject()
private void inject(){
for(BeanDefinition beanDefinition : beanDefines){
Object bean = beanDefinitionMap.get(beanDefinition.getId());
if(bean!=null){
try {
PropertyDescriptor [] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
for(PropertyDefinition propertyDefinition : beanDefinition.getProperties()){
for(PropertyDescriptor propertyDesc : ps){
if(propertyDesc.getName().equals(propertyDefinition.getName())){
Method setter = propertyDesc.getWriteMethod();// set
if(setter!=null){
Object value = beanDefinitionMap.get(propertyDefinition.getRef());
setter.setAccessible(true); // private
setter.invoke(bean, value);//
}
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.