zoukankan      html  css  js  c++  java
  • Spring之Ioc

    Spring的特性

      >> 轻量级(Lightweight)相较于EJB而言Spring是轻量级的容器,不依赖任何web容器

      >> 容器(Container) Spring本身不具备任何功能,仅仅是对JavaBean进行生命周期和读写的管理

      >> IOC( Inversion of Control )Spring实现的核心是IOC,即控制反转,完全由Spring容器负责维护资源间的依赖关系

      >> AOP( Aspect-oriented programming )AOP框架是Spring框架中的一个子框架,以切面编程模式在不更改源代码的情况下增加新的功能

    Spring 的核心概念是 IoC,IoC 的抽象概念是“依赖关系的转移”,像是“高层模组不应该依赖低层模组,而是模组都必须依赖于抽象”是 IoC 的一种表现,“实现必须依赖抽象,而不是抽象依赖实现”也是 IoC 的一种表现,“应用程序不应依赖于容器,而是容器服务于应用程序”也是 IoC 的一种表现。

    IoC 全名 Inversion of Control,如果中文硬要翻译过来的话,就是“控制反转”。初看 IoC,从字面上不容易了解其意义,要了解 IoC,要先从 Dependency Inversion 开始了解,也就是依赖关系的反转。

    IOC通过字面翻译即控制反转,在程序中又称为依赖注入

    如一个普通的类:

    public class User {

    private String name;

    public void setName(String name){……}

    public String getName(){……}

    }

    在这个类中定义的name属性和get set方法在我们看来已经是一种固定的编程模式思路了,属性和类是一个必然的联系

    我们现在提出的JAVA开发理念应该是:Write once only once

    从中可以看出其实这个类的属性和类之间还是存在很强的耦合性,如果需要更改name属性必须使用以下方式修改

    直接在类内部修改

    在外部通过setName方法更改

    Spring提出的IOC概念即对象的控制权进行转移,原本我们需要通过类自身对内容进行修改,通过IOC的反转可以交由外部对其自身内容进行更改。

    Spring通过三种实现依赖注入接口注入 set注入 构造器注入

    ApplicationContext.xml是Spring的核心配置文件,所有容器内组件的管理都依赖该配置文件,要实现IOC也需要在配置文件中写入信息

    <bean id=“user” class=“com.niit.User”></bean>

    <bean ……>

    ……

    Spring就是管理bean的容器框架

    set注入:

    <bean id=“user” class=“com.niit.User”>

    <property name=“name”>

      <value>Tom</value>

    </property>

    <property name=“pwd”>

      <value>123</value>

    </property>

    </bean>

    通过在配置文件中的写入,此时User类中各个属性的控制权就转移给了Spring容器,由容器读取配置文件设置类的属性值,从而达到控制反转的效果。

    如何对配置文件进行读取呢?

    Resource rs=new FileSystemResource(“src/ApplicationResource.xml”);

    BeanFactory factory=new XmlBeanFactory(rs);

    User user=(User)factory.getBean(“user”);

    FileSystemResource对象用来获取xml文件资源

    XmlBeanFactory是BeanFactory的实例,使用工厂模式获取对XML进行解析管理,负责读取Bean定义档,管理对象的载入、生成,对象之间的关系维护,负责Bean的生命周期,对于简单的应用程序来说,使用 BeanFactory就已经足够,但是若要利用到Spring在框架上的一些功能以及进阶的容器功能,则可以使用 ApplicationContext对象

    ApplicationContext相较于BeanFactory功能相似,但能提供更强大的框架支持

    使用ApplicationContext操作:

      ApplicationContext ctx=new ClassPathXmlApplicationContext(“ApplicationContext.xml”);

      User user=(User)ctx.getBean(“user”);

    ApplicationContext接口可以通过如下实现类操作:

    FileSystemXmlApplicationContext 从文件系统中读取配置文件

    ClassPathXmlApplicationContext 从项目路径中读取配置文件

    构造器注入:

    需要类中存在带参构造方法

    public class User {

       public User(String name,String pwd) {

        this.name=name;

        this.pwd=pwd;

      }

     }

    接口注入:

    <bean id=“tool” class=“com.niit.tool”>

    </bean>

    <bean id=“user” class=“com.niit.User”>

      <property name=“tool”>

         <ref bean=“tool”/>

      </property>

    </bean>

    主要要点:

    Spring中通过BeanFactory或者ApplicationContext获取的Bean的实例都是单例模式(Singleton),对于多线程的程序必须要主要安全问题,可以使每次获取Bean的实例时都产生一个新的实例。

    <bean id=“user” class=“com.niit.User” singleton=“false”> </bean>

  • 相关阅读:
    static final常量变量的正确书写规范
    Why aren't more desktop apps written with Qt?(quora.com系列文章)
    建议学个一知半解的时候,再看书
    C++中new和delete的背后(最后还是调用了MSVCR90的malloc)
    关于Qt的事件循环以及QEventLoop的简单使用(QEventLoop::quit()能够终止事件循环,事件循环是可以嵌套的)
    QProcess::startDetached(5.10有了一种新的方式)
    微信公众号支付开发
    Middleware

    TOKEN+签名验证
  • 原文地址:https://www.cnblogs.com/rain-in-summer/p/5196382.html
Copyright © 2011-2022 走看看