• spring-IOC控制反转


    IoC(Inversion of Control)控制反转,对象创建责任的反转,在springBeanFacotoryIoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。XmlBeanFacotory实现BeanFactory接口,通过获取xml配置文件数据,组成应用对象及对象间的依赖关系。

    spring中有三种注入方式,一种是set注入,一种是接口注入,另一种是构造方法注入。

    注:本实例是在idea软件上执行的,

    一.导包:

    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.9.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.2.11.Final</version>
    </dependency>

    二.实体类

     1 package com.yztc.ioc.bean;
     2 
     3 /**
     4  * @author
     5  */
     6 public class User {
     7     private Integer uid;
     8     private String name;
     9     public void init(){
    10         System.out.println("初始化对象");
    11     }
    12 
    13 
    14     public User() {
    15     }
    16 
    17     public User(Integer uid, String name) {
    18         this.uid = uid;
    19         this.name = name;
    20     }
    21 
    22     public Integer getUid() {
    23         return uid;
    24     }
    25 
    26     public void setUid(Integer uid) {
    27         this.uid = uid;
    28     }
    29 
    30     public String getName() {
    31         return name;
    32     }
    33 
    34     public void setName(String name) {
    35         this.name = name;
    36     }
    37 }

    三.配置beans.xml文件

    1 <beans>
    2     <bean id="user" class="com.yztc.ioc.bean.User">
    3 
    4         <property name="name" value="11111"/>
    5     </bean>
    6 </beans>

    四.BeanFactory类

     1 package com.yztc.ioc.bean;
     2 
     3 import org.dom4j.Attribute;
     4 import org.dom4j.Document;
     5 import org.dom4j.DocumentException;
     6 import org.dom4j.Element;
     7 import org.dom4j.io.SAXReader;
     8 
     9 import java.lang.reflect.Field;
    10 import java.util.HashMap;
    11 import java.util.List;
    12 import java.util.Map;
    13 
    14 /**
    15  * @author bindu
    16  *
    17  *
    18  */
    19 public class BeanFactory {
    20     public static final String DEFAULT_XML_NAME ="beans.xml";
    21     private String xmlName;
    22     private Map<String ,Object> beans = new HashMap<>();
    23 
    24     public BeanFactory() {
    25         this.xmlName =DEFAULT_XML_NAME;
    26         init();
    27 
    28     }
    29 
    30     public BeanFactory(String xmlName) {
    31         this.xmlName = xmlName != null&& !"".equals(xmlName)? xmlName:DEFAULT_XML_NAME;
    32         init();
    33     }
    34 
    35     /**
    36      * 1.xml解析
    37      * 2.实例化注册bean
    38      */
    39     private void init(){
    40         SAXReader reader = new SAXReader();
    41         try {
    42             //获得dom操作对象
    43             Document document = reader.read(this.getClass().getClassLoader().getResourceAsStream(xmlName));
    44             //获得xml文件的根元素
    45             Element root = document.getRootElement();
    46             //获得根元素下的所有子元素
    47             List<Element> elements = root.elements();
    48             //遍历所有bean子元素
    49             for (Element element : elements) {
    50                 //获得bean元素下的id元素
    51                 Attribute idAttr = element.attribute("id");
    52                 //获得id元素属性的值
    53                 String id = idAttr.getValue();
    54                 //获取bean元素下的class属性
    55                 Attribute claAttr = element.attribute("class");
    56                 //获取class属性的值
    57                 String value = claAttr.getValue();
    58                 //class对象实例化的三种方式
    59                 Class<?> cls = Class.forName(value);
    60                 Object o = cls.newInstance();
    61                 List<Element> properties = element.elements("property");
    62                 for (Element property : properties) {
    63                     Attribute nameAttr = property.attribute("name");
    64                     String value1 = nameAttr.getValue();
    65                     Field field = cls.getDeclaredField(value1);
    66                     //取消jvm运行时的访问检测机制
    67                     field.setAccessible(true);
    68                     Attribute valueAttr = property.attribute("value");
    69                     String value2 = valueAttr.getValue();
    70                     //给属性赋值
    71                     field.set(o,value2);
    72                 }
    73                 beans.put(id,o);
    74 
    75 
    76             }
    77 
    78 
    79         } catch (DocumentException e) {
    80             e.printStackTrace();
    81         } catch (ClassNotFoundException e) {
    82             e.printStackTrace();
    83         } catch (IllegalAccessException e) {
    84             e.printStackTrace();
    85         } catch (InstantiationException e) {
    86             e.printStackTrace();
    87         } catch (NoSuchFieldException e) {
    88             e.printStackTrace();
    89         }
    90     }
    91     public <T> T getBean(String name){
    92         return (T) beans.get(name);
    93     }
    94     public <T> T getBean(String name ,Class<T> cls){
    95         return (T) beans.get(name);
    96     }
    97 
    98 
    99 }

    五.测试类

     1 package com.yztc.ioc;
     2 
     3 import com.yztc.ioc.bean.BeanFactory;
     4 import com.yztc.ioc.bean.User;
     5 
     6 /**
     7  * @author
     8  */
     9 public class TestMain {
    10     public static void main(String[] args) {
    11         BeanFactory factory = new BeanFactory();
    12         User user1 = factory.getBean("user", User.class);
    13 
    14         System.out.println(user1);
    15     }
    16 
    17 
    18 }

      


















  • 相关阅读:
    mysql 数据类型总结
    #微信小程序子传父 #小程序子组件向父组件传值 小程序子组件触发父组件中的事件
    #最近看到了一个写的很棒的系列文章专栏
    《MySQL45讲》读书笔记(四):索引
    《MySQL45讲》读书笔记(六):数据库事务概述
    《MySQL45讲》读书笔记(一):三大日志概述
    Java基础篇(05):函数式编程概念和应用
    数据采集组件:Flume基础用法和Kafka集成
    架构设计:数据服务系统0到1落地实现方案
    Java基础篇(04):日期与时间API用法详解
  • 原文地址:https://www.cnblogs.com/1218-mzc/p/7703851.html
Copyright © 2020-2023  润新知