• 依赖注入、控制反转


    依赖注入(就是一个对象如何获取他所依赖的对象的引用,这个责任的反转。从这个对象内部的代码,转到了容器对组件进行装配和管理)

    依赖获取

    开放关闭原则(Open-Closed Principle)

    让一个实体从依赖另一个实体转向依赖一个接口(Protocol-Object Principle)

    一般实现构造注入和属性注入都是通过反射和xml来实现(通过反射机制获取待创建类的构造方法,同样的,属性注入也是通过反射得到待创建类的所有属性后根据这些在DI窗口节点进行分配、创建等)

    下面的代码贴自http://www.cnblogs.com/devinzhang/p/3862942.html

    public class Main {
         public static void main(String[] args) {
              /******************** IOC控制反转和依赖注入 ***************************/
              // 利用容器,通过xml文件直接注入属性值,在Main类中只添加需要的
              // Chinese和American,当类和方法修改时,代码完全不用修改,只需要修改xml文件即可,彻底实现了解耦
              BeanFactory beanFactory = new BeanFactory();
              beanFactory.init("/config.xml");
              UserBean userBean = (UserBean) beanFactory.getBean("userBean");
              System.out.println("userName=" + userBean.getUserName());
              System.out.println("password=" + userBean.getPassword());
         }
    }
    
    
    /******************** IOC控制反转和依赖注入 ***************************/
    // 下面是Spring的IOC实现:Bean工厂
    class BeanFactory {
         private Map<String, Object> beanMap = new HashMap<String, Object>();
    
         public void init(String fileName) {
              try {
                   // 读取指定的配置文件
                   SAXReader reader = new SAXReader();
                   // System.out.println(xmlpath);
                   String realPathString = new File("").getCanonicalPath();
                   Document document = reader.read(new File(realPathString + "/src/com/devin/") + fileName);
                   Element root = document.getRootElement();
                   Element foo;
                   // 遍历bean
                   for (Iterator i = root.elementIterator("bean"); i.hasNext();) {
                        foo = (Element) i.next();
                        // 获取bean的属性id和class
                        Attribute id = foo.attribute("id");
                        Attribute cls = foo.attribute("class");
                        // 利用Java反射机制,通过class的名称获取Class对象
                        Class bean = Class.forName(cls.getText());
                        // 获取对应class的信息
                        java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean);
                        // 获取其属性描述
                        java.beans.PropertyDescriptor pd[] = info.getPropertyDescriptors();
                        // 设置值的方法
                        Method mSet = null;
                        // 创建一个对象
                        Object obj = bean.newInstance();
                        // 遍历该bean的property属性
                        for (Iterator ite = foo.elementIterator("property"); ite.hasNext();) {
                             Element foo2 = (Element) ite.next();
                             // 获取该property的name属性
                             Attribute name = foo2.attribute("name");
                             String value = null;
                             // 获取该property的子元素value的值
                             for (Iterator ite1 = foo2.elementIterator("value"); ite1.hasNext();) {
                                  Element node = (Element) ite1.next();
                                  value = node.getText();
                                  break;
                             }
                             for (int k = 0; k < pd.length; k++) {
                                  if (pd[k].getName().equalsIgnoreCase(name.getText())) {
                                       mSet = pd[k].getWriteMethod();
                                       mSet.invoke(obj, value);
                                  }
                             }
                        }
    
                        // 将对象放入beanMap中,其中key为id值,value为对象
                        beanMap.put(id.getText(), obj);
                   }
              } catch (Exception e) {
                   System.out.println(e.toString());
              }
         }
    
         // 通过bean的id获取bean的对象.
         public Object getBean(String beanName) {
              Object obj = beanMap.get(beanName);
              return obj;
         }
    }
    
    
    UserBean.java
    
    public class UserBean {
         private String userName;
         private String password;
    
         public String getPassword() {
              return password;
         }
    
         public String getUserName() {
              return userName;
         }
    
         public void setUserName(String userName) {
              this.userName = userName;
         }
    
         public void setPassword(String password) {
              this.password = password;
         }
    }
    
    config.xml
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans>
         <bean id="userBean" class="com.devin.UserBean">
              <property name="userName">
                   <value>张三</value>
              </property>
              <property name="password">
                   <value>Jack</value>
              </property>
         </bean>
    </beans>
    

      

  • 相关阅读:
    TCP—为什么是AIMD?
    虚拟机是怎么实现的?
    漫谈linux文件IO
    关于大型网站技术演进的思考
    大公司里怎样开发和部署前端代码
    spawn-fcgi 代码介绍
    使用python传参form-data格式的txt请求接口
    实战scrapy抓取站长图片数据
    通过requests和lxml模块对网站数据进行爬取
    centos7.5下安装jenkins
  • 原文地址:https://www.cnblogs.com/yuantf/p/5401435.html
Copyright © 2020-2023  润新知