- import@H_502_11@ cn.itm.dao.PersonDao; @H_502_11@@H_502_11@
- @H_502_11@
- @H_502_11@
- public@H_502_11@ @H_502_11@class@H_502_11@ PersonDaoBean @H_502_11@implements@H_502_11@ PersonDao { @H_502_11@@H_502_11@
- @H_502_11@
- @H_502_11@
- public@H_502_11@ @H_502_11@void@H_502_11@ add(){ @H_502_11@@H_502_11@
- System.out.println("执行PersonDaoBean的add方法。。。"@H_502_11@); @H_502_11@@H_502_11@
- } @H_502_11@
- } @H_502_11@
- package@H_502_11@ cn.itm.service.impl; @H_502_11@@H_502_11@
- @H_502_11@
- import@H_502_11@ cn.itm.dao.PersonDao; @H_502_11@@H_502_11@
- import@H_502_11@ cn.itm.service.PersonService; @H_502_11@@H_502_11@
- @H_502_11@
- public@H_502_11@ @H_502_11@class@H_502_11@ PersonServiceBean @H_502_11@implements@H_502_11@ PersonService{ @H_502_11@@H_502_11@
- @H_502_11@
- @H_404_216@// 使用 Set方法 是实现依赖注入:@H_502_11@ @H_502_11@@H_502_11@
- private@H_502_11@ PersonDao personDao; @H_502_11@@H_502_11@
- @H_502_11@
- @H_502_11@
- public@H_502_11@ @H_502_11@void@H_502_11@ setPersonDao(PersonDao personDao) { @H_502_11@@H_502_11@
- this@H_502_11@.personDao = personDao; @H_502_11@@H_502_11@
- } @H_502_11@
- @H_502_11@
- @H_502_11@
- public@H_502_11@ @H_502_11@void@H_502_11@ save(){ @H_502_11@@H_502_11@
- @H_404_216@// 调用 依赖对象注入进来的方法了。@H_502_11@ @H_502_11@ @H_502_11@
- personDao.add(); @H_502_11@
- } @H_502_11@
- @H_502_11@
- } @H_502_11@
- <?xml version=@H_502_11@"1.0"@H_502_11@ encoding=@H_502_11@"UTF-8"@H_502_11@?> @H_502_11@@H_502_11@
- <beans xmlns="http://www.springframework.org/schema/beans"@H_502_11@ @H_502_11@@H_502_11@
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"@H_502_11@ @H_502_11@@H_502_11@
- xsi:schemaLocation="http:@H_404_216@//www.springframework.org/schema/beans@H_502_11@ @H_502_11@@H_502_11@
- http:@H_404_216@//www.springframework.org/schema/beans/spring-beans-2.5.xsd">@H_502_11@ @H_502_11@@H_502_11@
- @H_502_11@
- <bean id="personDao"@H_502_11@ @H_502_11@class@H_502_11@=@H_502_11@"cn.itm.dao.impl.PersonDaoBean"@H_502_11@></bean> @H_502_11@@H_502_11@
- @H_502_11@
- <bean id="personService"@H_502_11@ @H_502_11@class@H_502_11@=@H_502_11@"cn.itm.service.impl.PersonServiceBean"@H_502_11@ > @H_502_11@@H_502_11@
- <!-- 实现 注入 --> @H_502_11@
- <property name="personDao"@H_502_11@ ref=@H_502_11@"personDao"@H_502_11@></property> @H_502_11@@H_502_11@
- </bean> @H_502_11@
- @H_502_11@
- @H_502_11@
- </beans> @H_502_11@
测试类:@H_502_11@
- package@H_502_11@ junit.test; @H_502_11@ @H_502_11@
- @H_502_11@
- @H_502_11@
- import@H_502_11@ org.junit.BeforeClass; @H_502_11@ @H_502_11@
- import@H_502_11@ org.junit.Test; @H_502_11@ @H_502_11@
- import@H_502_11@ org.springframework.context.ApplicationContext; @H_502_11@@H_502_11@
- import@H_502_11@ org.springframework.context.support.ClassPathXmlApplicationContext; @H_502_11@@H_502_11@
- @H_502_11@
- import@H_502_11@ cn.itm.service.PersonService; @H_502_11@@H_502_11@
- @H_502_11@
- public@H_502_11@ @H_502_11@class@H_502_11@ SpringTest { @H_502_11@@H_502_11@
- @H_502_11@
- @BeforeClass@H_502_11@ @H_502_11@ @H_502_11@
- public@H_502_11@ @H_502_11@static@H_502_11@ @H_502_11@void@H_502_11@ setUpBeforeClass() @H_502_11@throws@H_502_11@ Exception { @H_502_11@@H_502_11@
- } @H_502_11@
- @H_502_11@
- @H_404_216@// 专门用来实例化 Spring 容器的。@H_502_11@ @H_502_11@@H_502_11@
- @Test@H_502_11@ @H_502_11@public@H_502_11@ @H_502_11@void@H_502_11@ instanceSpring(){ @H_502_11@@H_502_11@
- @H_502_11@
- ApplicationContext ctx = new@H_502_11@ ClassPathXmlApplicationContext(@H_502_11@"beans.xml"@H_502_11@); @H_502_11@@H_502_11@
- PersonService personService = (PersonService) ctx.getBean("personService"@H_502_11@); @H_502_11@@H_502_11@
- personService.save(); @H_502_11@
- @H_502_11@
- } @H_502_11@
- } @H_502_11@
成功。@H_502_11@
利用setter方式的好处:可以被多个bean使用。@H_502_11@
下面利用编码剖析Spring依赖注入的原理:@H_502_11@@H_502_11@
- package@H_502_11@ junit.test; @H_502_11@ @H_502_11@
- @H_502_11@
- @H_502_11@
- import@H_502_11@ java.beans.Introspector; @H_502_11@ @H_502_11@
- import@H_502_11@ java.beans.PropertyDescriptor; @H_502_11@@H_502_11@
- import@H_502_11@ java.lang.reflect.Method; @H_502_11@ @H_502_11@
- import@H_502_11@ java.net.URL; @H_502_11@ @H_502_11@
- import@H_502_11@ java.util.ArrayList; @H_502_11@ @H_502_11@
- import@H_502_11@ java.util.HashMap; @H_502_11@@H_502_11@
- import@H_502_11@ java.util.List; @H_502_11@@H_502_11@
- import@H_502_11@ java.util.Map; @H_502_11@ @H_502_11@
- @H_502_11@
- import@H_502_11@ org.dom4j.Document; @H_502_11@@H_502_11@
- import@H_502_11@ org.dom4j.Element; @H_502_11@@H_502_11@
- import@H_502_11@ org.dom4j.XPath; @H_502_11@@H_502_11@
- import@H_502_11@ org.dom4j.io.SAXReader; @H_502_11@ @H_502_11@
- @H_502_11@
- public@H_502_11@ @H_502_11@class@H_502_11@ ItmClassPathXMLApplicationContext { @H_502_11@@H_502_11@
- @H_502_11@
- private@H_502_11@ List<BeanDefinition> beanDefines = @H_502_11@new@H_502_11@ ArrayList<BeanDefinition>(); @H_502_11@ @H_502_11@
- @H_404_216@// 存放实例@H_502_11@ @H_502_11@@H_502_11@
- private@H_502_11@ Map<String,Object> sigletons = @H_502_11@new@H_502_11@ HashMap<String,Object>(); @H_502_11@@H_502_11@
- @H_502_11@
- public@H_502_11@ ItmClassPathXMLApplicationContext(String fileName){ @H_502_11@@H_502_11@
- this@H_502_11@.readXML(fileName); @H_502_11@@H_502_11@
- this@H_502_11@.instanceBeans(); @H_502_11@ @H_502_11@
- this@H_502_11@.injectObject(); @H_502_11@@H_502_11@
- } @H_502_11@
- @H_502_11@
- private@H_502_11@ @H_502_11@void@H_502_11@ injectObject() { @H_502_11@@H_502_11@
- for@H_502_11@(BeanDefinition beanDefinition : beanDefines){ @H_502_11@@H_502_11@
- @H_404_216@// 得到 bean 。。@H_502_11@ @H_502_11@@H_502_11@
- Object bean = sigletons.get(beanDefinition.getId()); @H_502_11@
- if@H_502_11@(bean != @H_502_11@null@H_502_11@){ @H_502_11@@H_502_11@
- try@H_502_11@ { @H_502_11@ @H_502_11@
- @H_404_216@// 得到 bean的属性描述:@H_502_11@ @H_502_11@@H_502_11@
- PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors(); @H_502_11@
- @H_404_216@// 循环 bean里面的 所有的属性:@H_502_11@ @H_502_11@@H_502_11@
- for@H_502_11@( PropertyDefinition propertyDefinition: beanDefinition.getPropertys()){ @H_502_11@@H_502_11@
- for@H_502_11@(PropertyDescriptor propertyDesc @H_502_11@@H_404_216@/*这里是 bean 里面的属性*/@H_502_11@ : ps){ @H_502_11@@H_502_11@
- if@H_502_11@(propertyDefinition.getName().equals(propertyDesc.getName())){ @H_502_11@@H_502_11@
- @H_404_216@// 如果相等 说明是存在 于 这个bean的。。。@H_502_11@ @H_502_11@@H_502_11@
- Method setter = propertyDesc.getWriteMethod(); @H_404_216@// 获取属性的 setter方法。@H_502_11@ @H_502_11@@H_502_11@
- @H_404_216@// 最好做一下判断:@H_502_11@ @H_502_11@@H_502_11@
- if@H_502_11@(setter != @H_502_11@null@H_502_11@){ @H_502_11@@H_502_11@
- Object value = sigletons.get(propertyDefinition.getRef()); @H_502_11@
- setter.setAccessible(true@H_502_11@); @H_502_11@@H_404_216@// 允许访问 私有的方法。。@H_502_11@ @H_502_11@@H_502_11@
- setter.invoke(bean,value);@H_404_216@// 把引用对象注入到属性。@H_502_11@ @H_502_11@@H_502_11@
- } @H_502_11@
- break@H_502_11@; @H_502_11@@H_502_11@
- } @H_502_11@
- } @H_502_11@
- } @H_502_11@
- } catch@H_502_11@ (Exception e) { @H_502_11@@H_502_11@
- e.printStackTrace(); @H_502_11@
- } @H_502_11@
- } @H_502_11@
- } @H_502_11@
- } @H_502_11@
- @H_502_11@
- @H_404_216@/**@H_502_11@ @H_502_11@
- @H_404_216@ * 通过反射技术,完成 bean 的实例化:@H_502_11@ @H_502_11@
- @H_404_216@ */@H_502_11@ @H_502_11@@H_502_11@
- private@H_502_11@ @H_502_11@void@H_502_11@ instanceBeans() { @H_502_11@@H_502_11@
- for@H_502_11@(BeanDefinition beanDefinition : beanDefines){ @H_502_11@@H_502_11@
- try@H_502_11@ { @H_502_11@@H_502_11@
- if@H_502_11@(beanDefinition.getClassName() != @H_502_11@null@H_502_11@ && !@H_502_11@""@H_502_11@.equals(beanDefinition.getClassName().trim())){ @H_502_11@@H_502_11@
- sigletons.put(beanDefinition.getId(),Class.forName(beanDefinition.getClassName()).newInstance()); @H_502_11@
- } @H_502_11@
- } catch@H_502_11@ (Exception e) { @H_502_11@@H_502_11@
- e.printStackTrace(); @H_502_11@
- } @H_502_11@
- } @H_502_11@
- @H_502_11@
- } @H_502_11@
- @H_502_11@
- @H_502_11@
- @H_502_11@
- @H_404_216@/**@H_502_11@ @H_502_11@
- @H_404_216@ * 读取 XML 的配置文件:@H_502_11@ @H_502_11@
- @H_404_216@ * @param fileName@H_502_11@ @H_502_11@
- @H_404_216@ */@H_502_11@ @H_502_11@@H_502_11@
- @SuppressWarnings@H_502_11@(@H_502_11@"unchecked"@H_502_11@) @H_502_11@@H_502_11@
- private@H_502_11@ @H_502_11@void@H_502_11@ readXML(String fileName) { @H_502_11@@H_502_11@
- @H_404_216@// 创建读取器:@H_502_11@ @H_502_11@ @H_502_11@
- SAXReader saxReader = new@H_502_11@ SAXReader(); @H_502_11@@H_502_11@
- Document document = null@H_502_11@; @H_502_11@@H_502_11@
- @H_502_11@
- try@H_502_11@{ @H_502_11@@H_502_11@
- URL xmlPath = this@H_502_11@.getClass().getClassLoader().getResource(fileName); @H_502_11@@H_502_11@
- document = saxReader.read(xmlPath); @H_404_216@ // 读取文件的内容。。。@H_502_11@ @H_502_11@@H_502_11@
- @H_502_11@
- Map<String,String> nsMap = new@H_502_11@ HashMap<String,String>(); @H_502_11@@H_502_11@
- nsMap.put("ns"@H_502_11@,@H_502_11@"http://www.springframework.org/schema/beans"@H_502_11@); // 加入命名空间 @H_502_11@@H_502_11@
- @H_502_11@
- @H_404_216@// 创建beans/bean 查询路径。@H_502_11@ @H_502_11@ @H_502_11@
- XPath xsub = document.createXPath("//ns:beans/ns:bean"@H_502_11@); @H_502_11@@H_502_11@
- @H_502_11@
- @H_404_216@// 设置命名空间。@H_502_11@ @H_502_11@ @H_502_11@
- xsub.setNamespaceURIs(nsMap); @H_502_11@
- @H_502_11@
- @H_404_216@// 获取文档下 所有bean节点:@H_502_11@ @H_502_11@ @H_502_11@
- List<Element> beans = xsub.selectNodes(document); @H_502_11@
- for@H_502_11@(Element element : beans){ @H_502_11@@H_502_11@
- String id = element.attributeValue("id"@H_502_11@); @H_502_11@@H_404_216@// 获取id属性值。@H_502_11@ @H_502_11@@H_502_11@
- String clazz = element.attributeValue("class"@H_502_11@); @H_502_11@@H_404_216@// 获取 class 属性值。@H_502_11@ @H_502_11@@H_502_11@
- BeanDefinition beanDefine = new@H_502_11@ BeanDefinition(id,clazz); @H_502_11@@H_502_11@
- @H_502_11@
- @H_404_216@// 查询的相对路径:@H_502_11@ @H_502_11@@H_502_11@
- XPath propertysub = element.createXPath("ns:property"@H_502_11@); @H_502_11@@H_502_11@
- propertysub.setNamespaceURIs(nsMap);@H_404_216@// 设置命名空间。@H_502_11@ @H_502_11@@H_502_11@
- @H_502_11@
- List<Element> propertys = propertysub.selectNodes(element); @H_502_11@
- for@H_502_11@(Element property : propertys){ @H_502_11@@H_502_11@
- String propertyName = property.attributeValue("name"@H_502_11@); @H_502_11@@H_502_11@
- String propertyRef = property.attributeValue("ref"@H_502_11@); @H_502_11@@H_502_11@
- System.out.println(propertyName + "=="@H_502_11@ + propertyRef); @H_502_11@@H_502_11@
- PropertyDefinition propertyDefinition = new@H_502_11@ PropertyDefinition(propertyName,propertyRef); @H_502_11@@H_502_11@
- @H_502_11@
- @H_404_216@// 放到 bean里面去:@H_502_11@ @H_502_11@@H_502_11@
- beanDefine.getPropertys().add(propertyDefinition); @H_502_11@
- @H_502_11@
- } @H_502_11@
- beanDefines.add(beanDefine); @H_502_11@
- } @H_502_11@
- @H_502_11@
- }catch@H_502_11@(Exception e){ @H_502_11@@H_502_11@
- e.printStackTrace(); @H_502_11@
- } @H_502_11@
- } @H_502_11@
- @H_502_11@
- @H_502_11@
- @H_404_216@/**@H_502_11@ @H_502_11@
- @H_404_216@ * 获取 bean实例@H_502_11@ @H_502_11@
- @H_404_216@ * @param beanName@H_502_11@ @H_502_11@
- @H_404_216@ * @return@H_502_11@ @H_502_11@
- @H_404_216@ */@H_502_11@ @H_502_11@@H_502_11@
- public@H_502_11@ Object getBean(String beanName){ @H_502_11@@H_502_11@
- return@H_502_11@ @H_502_11@this@H_502_11@.sigletons.get(beanName); @H_502_11@@H_502_11@
- } @H_502_11@
- @H_502_11@
- } @H_502_11@
原文链接:https://www.f2er.com/javaschema/286743.html