您现在的位置是:首页 >

spring的工作原理 模拟spring框架注入实现原理

火烧 2021-11-18 15:35:39 1045
模拟 ri g框架注入实现原理   定义一些抽象的方法  [java]   ackage huxi ri gi ject dao    u lic i terface Per o {   u lic

模拟spring框架注入实现原理  

  定义一些抽象的方法

  [java]

  package huxin springinject dao;

  public interface Person {

  public void save();

  public void useAxe();

  }

  package huxin springinject dao;

  public interface Person {

  public void save();

  public void useAxe();

  }

  [java]

  package huxin springinject dao;

  public interface Axe {

  public void  chop();

  }

  package huxin springinject dao;

  public interface Axe {

  public void  chop();

  }

  实现的一些方法

  [java]

  package huxin springinject dao impl;

  import huxin springinject dao Axe;

  import huxin springinject dao Person;

  public class Chinese implements Person {

  private Axe axe;

  public Axe getAxe() {

  return axe;

  }

  public void setAxe(Axe axe) {

  this axe = axe;

  }

  public void save() {

  System out println( 保存人的方法 );

  }

  public void useAxe(){

  axe chop();

  }

  }

  package huxin springinject dao impl;

  import huxin springinject dao Axe;

  import huxin springinject dao Person;

  public class Chinese implements Person {

  private Axe axe;

  public Axe getAxe() {

  return axe;

  }

  public void setAxe(Axe axe) {

  this axe = axe;

  }

  public void save() {

  System out println( 保存人的方法 );

  }

  public void useAxe(){

  axe chop();

  }

  }

  [java]

  package huxin springinject dao impl;

  import huxin springinject dao Axe;

  public class StoneAxe implements Axe {

  @Override

  public void chop() {

  System out println( 铁斧头砍柴真慢 );

  }

  }

  package huxin springinject dao impl;

  import huxin springinject dao Axe;

  public class StoneAxe implements Axe {

  @Override

  public void chop() {

  System out println( 铁斧头砍柴真慢 );

  }

  }

  这里是关键spring框架模拟的实现的一些原理!!!

  [java]

  package junit test;

  import java beans Introspector;

  import java beans PropertyDescriptor;

  import java lang reflect Method;

  import URL;

  import java util ArrayList;

  import java util HashMap;

  import java util List;

  import java util Map;

  import mons beanutils ConvertUtils;

  import dom j Document;

  import dom j Element;

  import dom j XPath;

  import dom j io SAXReader;

  public class ApplicationContext {

  List<BeanInformation> beansInformation = new ArrayList<BeanInformation>();

spring的工作原理 模拟spring框架注入实现原理

  Map<String Object> singleton = new HashMap<String Object>();

  public ApplicationContext(){};

  public ApplicationContext(String filename){

  readXml(filename);

  initBean();

  this injectObject();

  }

  public void readXml(String filename){

  SAXReader saxReader = new SAXReader();

  Document document = null;

  try{

  //使用反射机制 通过文件名加载文件路径

  URL xmlPath = this getClass() getClassLoader() getResource(filename);

  //通过文件路径获得这个文件的document对象

  document = saxReader read(xmlPath);

  Map<String String> nsMap = new HashMap<String String>();

  nsMap put( ns /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){

  System out println(element attributeValue( id ));

  System out println(element attributeValue( class ));

  BeanInformation beanInformation = new BeanInformation();

  beanInformation setId(element attributeValue( id ));

  beanInformation setName(element attributeValue( class ));

  XPath xref = element createXPath( ns:property );//创建properties查询路径

  xref setNamespaceURIs(nsMap);//设置命名空间

  List<Element> propertys = xref selectNodes(element);

  for(Element property : propertys){

  PropertyInformation propertyInformation = new PropertyInformation();

  propertyInformation setName(property attributeValue( name ));

  propertyInformation setRef(property attributeValue( ref ));

  propertyInformation setValue(property attributeValue( value ));

  beanInformation getPropertyInformation() add(propertyInformation);

  }

  beansInformation add(beanInformation);

  }

  } catch(Exception e){

  e printStackTrace();

  }

  }

  public void initBean(){

  for(BeanInformation beanInformation: beansInformation){

  if(beanInformation getName()!=null && ! equals(beanInformation getName())){

  //通过反射机制 根据名字初始化这个类

  try {

  singleton put(beanInformation getId() Class forName(beanInformation getName()) newInstance());

  } catch (Exception e) {

  e printStackTrace();

  }

  }

  }

  }

  /**

  *    关于注入的实现

  */

  private void injectObject() {

  for(BeanInformation beanInformation : beansInformation){

  Object bean = singleton get(beanInformation getId());

  if(bean!=null){

  try {

  PropertyDescriptor[] ps = Introspector getBeanInfo(bean getClass()) getPropertyDescriptors();

  for(PropertyInformation propertyInformation : beanInformation getPropertyInformation()){

  for(PropertyDescriptor properdesc : ps){

  if(propertyInformation getName() equals(properdesc getName())){

  Method setter = properdesc getWriteMethod();//获取属性的setter方法 private

  if(setter!=null){

  Object value = null;

  if(propertyInformation getRef()!=null && ! equals(propertyInformation getRef() trim())){

  value = singleton get(propertyInformation getRef());

  }else{

  value = nvert(propertyInformation getValue() properdesc getPropertyType());

  }

  setter setAccessible(true);

  setter invoke(bean value);//把引用对象注入到属性

  }

  break;

  }

  }

  }

  } catch (Exception e) {

  }

  }

  }

  }

  public Object getBean(String id){

  return this singleton get(id);

  }

  }

  package junit test;

  import java beans Introspector;

  import java beans PropertyDescriptor;

  import java lang reflect Method;

  import URL;

  import java util ArrayList;

  import java util HashMap;

  import java util List;

  import java util Map;

  import mons beanutils ConvertUtils;

  import dom j Document;

  import dom j Element;

  import dom j XPath;

  import dom j io SAXReader;

  public class ApplicationContext {

  List<BeanInformation> beansInformation = new ArrayList<BeanInformation>();

  Map<String Object> singleton = new HashMap<String Object>();

  public ApplicationContext(){};

  public ApplicationContext(String filename){

  readXml(filename);

  initBean();

  this injectObject();

  }

  public void readXml(String filename){

  SAXReader saxReader = new SAXReader();

  Document document = null;

  try{

  //使用反射机制 通过文件名加载文件路径

  URL xmlPath = this getClass() getClassLoader() getResource(filename);

  //通过文件路径获得这个文件的document对象

  document = saxReader read(xmlPath);

  Map<String String> nsMap = new HashMap<String String>();

  nsMap put( ns /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){

  System out println(element attributeValue( id ));

  System out println(element attributeValue( class ));

  BeanInformation beanInformation = new BeanInformation();

  beanInformation setId(element attributeValue( id ));

  beanInformation setName(element attributeValue( class ));

  XPath xref = element createXPath( ns:property );//创建properties查询路径

  xref setNamespaceURIs(nsMap);//设置命名空间

  List<Element> propertys = xref selectNodes(element);

  for(Element property : propertys){

  PropertyInformation propertyInformation = new PropertyInformation();

  propertyInformation setName(property attributeValue( name ));

  propertyInformation setRef(property attributeValue( ref ));

  propertyInformation setValue(property attributeValue( value ));

  beanInformation getPropertyInformation() add(propertyInformation);

  }

  beansInformation add(beanInformation);

  }

  } catch(Exception e){

  e printStackTrace();

  }

  }

  public void initBean(){

  for(BeanInformation beanInformation: beansInformation){

  if(beanInformation getName()!=null && ! equals(beanInformation getName())){

  //通过反射机制 根据名字初始化这个类

  try {

  singleton put(beanInformation getId() Class forName(beanInformation getName()) newInstance());

  } catch (Exception e) {

  e printStackTrace();

  }

  }

  }

  }

  /**

  *    关于注入的实现

  */

  private void injectObject() {

  for(BeanInformation beanInformation : beansInformation){

  Object bean = singleton get(beanInformation getId());

  if(bean!=null){

  try {

  PropertyDescriptor[] ps = Introspector getBeanInfo(bean getClass()) getPropertyDescriptors();

  for(PropertyInformation propertyInformation : beanInformation getPropertyInformation()){

  for(PropertyDescriptor properdesc : ps){

  if(propertyInformation getName() equals(properdesc getName())){

  Method setter = properdesc getWriteMethod();//获取属性的setter方法 private

  if(setter!=null){

  Object value = null;

  if(propertyInformation getRef()!=null && ! equals(propertyInformation getRef() trim())){

  value = singleton get(propertyInformation getRef());

  }else{

  value = nvert(propertyInformation getValue() properdesc getPropertyType());

  }

  setter setAccessible(true);

  setter invoke(bean value);//把引用对象注入到属性

  }

  break;

  }

  }

  }

  } catch (Exception e) {

  }

  }

  }

  }

  public Object getBean(String id){

  return this singleton get(id);

  }

  }

  [java]

  package junit test;

  import java util HashSet;

  import java util Set;

  public class BeanInformation {

  private String id;

  private String name;

  private Set<PropertyInformation> propertyInformation = new HashSet<PropertyInformation>();

  public String getId() {

  return id;

  }

  public void setId(String id) {

  this id = id;

  }

  public String getName() {

  return name;

  }

  public void setName(String name) {

  this name = name;

  }

  public Set<PropertyInformation> getPropertyInformation() {

  return propertyInformation;

  }

  public void setPropertyInformation(Set<PropertyInformation> propertyInformation) {

  this propertyInformation = propertyInformation;

  }

  }

  package junit test;

  import java util HashSet;

  import java util Set;

  public class BeanInformation {

  private String id;

  private String name;

  private Set<PropertyInformation> propertyInformation = new HashSet<PropertyInformation>();

  public String getId() {

  return id;

  }

  public void setId(String id) {

  this id = id;

  }

  public String getName() {

  return name;

  }

  public void setName(String name) {

  this name = name;

  }

  public Set<PropertyInformation> getPropertyInformation() {

  return propertyInformation;

  }

  public void setPropertyInformation(Set<PropertyInformation> propertyInformation) {

  this propertyInformation = propertyInformation;

  }

  }

  [java]

  package junit test;

  public class PropertyInformation {

  private String name;

  private String ref;

  private String value;

  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 String getValue() {

  return value;

  }

  public void setValue(String value) {

  this value = value;

  }

  }

  package junit test;

  public class PropertyInformation {

  private String name;

  private String ref;

  private String value;

  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 String getValue() {

  return value;

  }

  public void setValue(String value) {

  this value = value;

  }

  }

  测试类

  [java]

  package junit test;

  import huxin springinject dao Person;

  public class Test {

  public static void main(String[] args) {

  ApplicationContext ac = new ApplicationContext( applicationContext xml );

  Person person = (Person)ac getBean( chinese );

  person save();

  person useAxe();

  }

  }

  package junit test;

  import huxin springinject dao Person;

  public class Test {

  public static void main(String[] args) {

  ApplicationContext ac = new ApplicationContext( applicationContext xml );

  Person person = (Person)ac getBean( chinese );

  person save();

  person useAxe();

  }

  }

  []

  <?xml version= encoding= UTF ?>

  <beans xmlns= /schema/beans

  xmlns:xsi= / /XMLSchema instance

  xmlns:context= /schema/context

  xsi:schemaLocation= /schema/beans

  /schema/beans/spring beans xsd

  /schema/context

  /schema/context/spring context xsd >

  <bean id= chinese   class= huxin springinject dao impl Chinese >

  <property name= axe ref= stoneAxe />

  </bean>

  <bean id= stoneAxe class= huxin springinject dao impl StoneAxe />

  </beans>

  <?xml version= encoding= UTF ?>

  <beans xmlns= /schema/beans

  xmlns:xsi= / /XMLSchema instance

  xmlns:context= /schema/context

  xsi:schemaLocation= /schema/beans

  /schema/beans/spring beans xsd

  /schema/context

  /schema/context/spring context xsd >

  <bean id= chinese   class= huxin springinject dao impl Chinese >

  <property name= axe ref= stoneAxe />

  </bean>

  <bean id= stoneAxe class= huxin springinject dao impl StoneAxe />

  </beans>

lishixinzhi/Article/program/Java/ky/201311/28763  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码