spring 의존 주입 원리 분석
인터페이스:PersonDao.java
package com.luojing.test.dao;
public interface PersonDao {
public void add();
}
구현 클래스:PersonDaoImp.java
package com.luojing.test.daoimp;
import com.luojing.test.dao.PersonDao;
public class PersonDaoImp implements PersonDao {
public void add() {
System.out.println(" add() !!!");
}
}
서비스 인터페이스:PersonService.java
package com.luojing.test.service;
public interface PersonService {
public void save();
}
서비스 구현 클래스:PersonServiceImp.자바
package com.luojing.test.serviceimp;
import com.luojing.test.dao.PersonDao;
import com.luojing.test.service.PersonService;
public class PersonServiceImp implements PersonService {
private PersonDao personDao;
public PersonDao getPersonDao() {
return personDao;
}
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
public void save() {
personDao.add();
}
}
applicationContext.xml 프로필 은 다음 과 같 습 니 다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" >
<bean id="personDao" class="com.luojing.test.daoimp.PersonDaoImp"/>
<bean id="service" class="com.luojing.test.serviceimp.PersonServiceImp">
<property name="personDao" ref="personDao"></property>
</bean>
</beans>
bean 을 만 들 고 그 속성 을 집합 으로 bean 에 저장 합 니 다.BeanDefinition.java:
package com.luojing.test.testioc;
import java.util.ArrayList;
import java.util.List;
public class BeanDefinition {
private String id;
private String classname;
private List<PropertyDefinition> propertys = new ArrayList<PropertyDefinition>();
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> getPropertys() {
return propertys;
}
public void setPropertys(List<PropertyDefinition> propertys) {
this.propertys = propertys;
}
public BeanDefinition(String id,String classname){
this.id = id;
this.classname = classname;
}
}
속성 bean PropertyDefinition.java:
package com.luojing.test.testioc;
public class PropertyDefinition {
private String name;
private String ref;
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;
}
public PropertyDefinition(String name,String ref){
this.name = name;
this.ref = ref;
}
}
spring 프로필 을 분석 하고 실례 를 들 면 bean ItcastClassPathXMLapplicationContext.java:
package com.luojing.test.testioc;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
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 ItcastClassPathXMLApplicationContext {
private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
private Map<String, Object> sigletons = new HashMap<String, Object>();
public ItcastClassPathXMLApplicationContext(String filename){
this.readXML(filename);
this.instanceBeans();
this.injectObject();
}
/**
* bean
*/
private void instanceBeans() {
for (BeanDefinition beanDefinition : beanDefines) {
try {
if (beanDefinition.getClassname() != null && !"".equals(beanDefinition.getClassname().trim()))
sigletons.put(beanDefinition.getId(), Class.forName(
beanDefinition.getClassname()).newInstance());
} catch (Exception e) {
// bean
e.printStackTrace();
}
}
}
/**
* bean
*/
private void injectObject() {
for (BeanDefinition beanDefinition : beanDefines) {
Object bean = sigletons.get(beanDefinition.getId());
if (bean != null) {
try {
PropertyDescriptor[] ps = Introspector.getBeanInfo(
bean.getClass()).getPropertyDescriptors();
//Introspector bean
for (PropertyDefinition propertyDefinition : beanDefinition
.getPropertys()) {
for (PropertyDescriptor properdesc : ps) {
if (propertyDefinition.getName().equals(properdesc.getName())) {
Method setter = properdesc.getWriteMethod();// setter
// ,private
if (setter != null) {// set ,
Object value = sigletons
.get(propertyDefinition.getRef());
setter.setAccessible(true);// set ,
setter.invoke(bean, value);//
}
break;
}
}
}
} catch (Exception e) {
}
}
}
}
/**
* xml
*/
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
System.out.println(id + " = " + clazz);
BeanDefinition beanDefine = new BeanDefinition(id, clazz);
XPath propertysub = element.createXPath("ns:property");
propertysub.setNamespaceURIs(nsMap);//
List<Element> propertys = propertysub.selectNodes(element);
for (Element property : propertys) {
String propertyName = property.attributeValue("name");
String propertyref = property.attributeValue("ref");
System.out.println(propertyName + " = " + propertyref);
PropertyDefinition propertyDefinition = new PropertyDefinition(
propertyName, propertyref);
beanDefine.getPropertys().add(propertyDefinition);
}
beanDefines.add(beanDefine);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* bean
*/
public Object getBean(String beanName) {
return this.sigletons.get(beanName);
}
}
테스트 클래스 SpringTest.java:
package com.luojing.test.testioc;
import com.luojing.test.service.PersonService;
public class SpringTest {
public static void main(String[] args) {
ItcastClassPathXMLApplicationContext ctx = new ItcastClassPathXMLApplicationContext("applicationContext.xml");
PersonService ps = (PersonService)ctx.getBean("service");
ps.save();
}
}
내 가 실행 하 는 과정 에서 자바.lang.NoClassDef Foundation Error:org/jaxen/Jaxen Exception 이 나 를 한참 동안 만 들 었 다.나중에 인터넷 에서 그 이 유 를 찾 아 냈 다.dom4j.jar 가 있어 야 하 는 것 을 제외 하고 jaxen-1.1.1.jar 파일 이 있어 야 한다.dom4j 를 사용 할 때 XPath 를 호출 했 기 때문에 프로젝트 에 jaxen-xx.jar 를 불 러 오지 않 았 다.jaxen 은 자바 로 개발 한 XPath 엔진 이다.JDom,dom4j 지원.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.