`
thaIm
  • 浏览: 91796 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring --- IOC

阅读更多
一) IOC其实很简单
   什么是IOC(控制反转)? 这名词听起来玄乎,其实so easy。简而言之,就是通过配置文件来反过来控制代码变化。广义上说,凡是你使用了配置文件的形式来提高代码的灵活性和通用性的,都可以说是一种控制反转。因为那部分由配置文件决定的逻辑便是你将控制权从代码手中反转到配置文件中的运用。(一家之言,仅供参考。也许片面也许错误~~)。总结来说,所谓“控制反转”的概念就是:控制权由应用代码中转到了外部容器,控制权的转移就是所谓反转。
   那么,如何实现IOC呢?这更简单,只要知道怎么载入配置文件的人都可以定义一套解析规则来实现。但如果每人一套自己的规则这显然IOC界就变得各自为战,乱作一团了。经业界大牛们的实践经验和总结讨论。我们基本都统一使用以下三种方式:
   Type1:接口注入:
public class ClassA { 
   private InterfaceB clzB; 
 
   public Object doSomething(InterfaceB b) { 
      clzB = b; 
      return clzB.doIt(); 
    }
 ......
} 

   doIt()到底做些什么,由注入的InterfaceB b决定。一个具体的实例就是Servlet:
public class MyServlet extends HttpServlet { 
 
  public void doGet( HttpServletRequest request,  HttpServletResponse response) 
     throws ServletException, IOException { 
   …… 
  } 
} 

   HttpServletRequest和HttpServletResponse实例由Servlet Container
在运行期动态注入。

   Type2:设值注入:
    即我们最熟悉的set get注入。

   Type3: 构造子注入:
    即通过构造函数完成依赖关系的设定
public class DIByConstructor { 
   private final DataSource dataSource; 
   private final String message; 
  
   public DIByConstructor(DataSource ds, String msg) { 
     this.dataSource = ds; 
     this.message = msg; 
    } 
  …… 
} 

   这便是我们常说的依赖注入DI。IOC通过DI的方式来实现其理念!
   最后引用一个大牛的结论:
    接口注入模式因为历史较为悠久,在很多容器中都已经得到应用。但由于其在灵活性、易用性上不如两种注入模式,因而在IOC的专题世界内并不被看好。
    Type3和Type2模式各有千秋,而Spring、PicoContainer都对Type3和Type2类型的依赖注入机制提供了良好支持。这也就为我们提供了更多的选择余地。理论上,以Type3类型为主,辅之以Type2类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于Spring Framework开发的应用而言,Type2使用更加广泛。

二) Spring的IOC其实不简单
  1)name 和 id
  在BeanFactory的配置中,<bean>是我们最常见的配置项,它有两个最常见的属性,即id和name。
  首先它们都可以通过BeanFactory的getBean()属性来获得对应的实例。
  但是区别如下:
  1'  id和name 都不能以数字,符号打头,不能有空格。但id在spring初始化的时候就报错,name则在getBean()时报错。
  2'  配置文件中不允许出现两个id相同的<bean>,但配置文件中允许出现两个name相同的<bean>。在用getBean()返回实例时,后面一个Bean被返回。
  3'  name属性可以用,隔开指定多个名字,如<bean name="b1,b2,b3">,相当于多个别名。或者显示的声明别名:
   <alias name="fromName" alias="toName"/>

  其它的注意点有:
  1' 如果id和name都没有指定,则用类全名作为name,如<bean class="com.test.noNameId">,则你可以通过
   getBean("com.test.noNameId")返回该实例。
  2' 如果存在多个id和name都没有指定,且实例类都一样的<bean>,如:
<bean class = "com.test.noNameId" />   
<bean class = "com.test.noNameId" />   
<bean class = "com.test.noNameId" />  

   则第一个bean通过getBean("com.test.noNameId")获得,
     第二个bean通过getBean("com.test.noNameId#1")获得,
     第三个bean通过getBean("com.test.noNameId#2")获得,以此类推。

   2) bean的初始化
   bean的初始化有三种方法:
   1' 构造函数初始化
    
  <bean id="exampleBean" class="examples.ExampleBean"/> 
  <bean name="anotherExample" class="examples.ExampleBeanTwo"/>

   spring最常见的一种初始化配置。初始化时调用默认的构造函数。

   2' 静态工厂方法初始化
<bean id="clientService" class="examples.ClientService" factory-method="createInstance"/>
   public class ClientService {
       private static ClientService clientService = new ClientService();
       private ClientService() {}
       public static ClientService createInstance() {
           return clientService;
       }
   }

    初始化时,spring会调用静态方法createInstance来实例化clientService。

    3' 工厂方法初始化
<bean id="serviceLocator" class="examples.DefaultServiceLocator"></bean>
<bean id="clientService" factory-bean="serviceLocator" factory-method="createClientServiceInstance"/>
public class DefaultServiceLocator {
    private static ClientService clientService = new ClientServiceImpl();
    private DefaultServiceLocator() {}
    public ClientService createClientServiceInstance() {
        return clientService;
    }
}

    初始化clientService时,spring会调用DefaultServiceLocator.createClientServiceInstance()来实例化。

    3)Collections
   
<bean id="moreComplexObject" class="example.ComplexObject">

<!-- results in a setAdminEmails(java.util.Properties) call -->
<property name="adminEmails">
  <props>
    <prop key="administrator">administrator@example.org</prop>
    <prop key="support">support@example.org</prop>
    <prop key="development">development@example.org</prop>
  </props>
</property>

<!-- results in a setSomeList(java.util.List) call -->
<property name="someList">
  <list>
    <value>a list element followed by a reference</value>
    <ref bean="myDataSource" />
  </list>
</property>

<!-- results in a setSomeMap(java.util.Map) call -->
<property name="someMap">
  <map>
    <entry key="an entry" value="just some string"/>
    <entry key ="a ref" value-ref="myDataSource"/>
  </map>
</property>

<!-- results in a setSomeSet(java.util.Set) call -->
<property name="someSet">
  <set>
    <value>just some string</value>
    <ref bean="myDataSource" />
  </set>
</property>

</bean>


  Collection merge
<beans>
<bean id="parent" abstract="true" class="example.ComplexObject">
  <property name="adminEmails">
    <props>
      <prop key="administrator">administrator@example.com</prop>
      <prop key="support">support@example.com</prop>
    </props>
  </property>
</bean>
<bean id="child" parent="parent">
  <property name="adminEmails">
    <!-- the merge is specified on the *child* collection definition -->
    <props merge="true">
      <prop key="sales">sales@example.com</prop>
      <prop key="support">support@example.co.uk</prop>
    </props>
  </property>
</bean>
<beans>

  child的bean将具有property:
administrator=administrator@example.com
sales=sales@example.com
support=support@example.co.uk

   4) null的表示
<bean class="ExampleBean">
  <property name="email"><null/></property>
</bean>


   5) p-namespace c-namespace的缩写
<bean name="john-classic" class="com.example.Person">
  <property name="name" value="John Doe"/>
  <property name="spouse" ref="jane"/>
</bean>
<bean name="john-modern" class="com.example.Person" p:name="John Doe" p:spouse-ref="jane"/>
<bean name="jane" class="com.example.Person">
  <property name="name" value="Jane Doe"/>
</bean>


<bean id="bar" class="x.y.Bar"/>
<bean id="baz" class="x.y.Baz"/>
<-- 'traditional' declaration -->
<bean id="foo" class="x.y.Foo">
  <constructor-arg ref="bar"/>
  <constructor-arg ref="baz"/>
  <constructor-arg value="foo@bar.com"/>
</bean>
<-- 'c-namespace' declaration -->
<bean id="foo" class="x.y.Foo" c:bar-ref="bar" c:baz-ref="baz" c:email="foo@bar.com">
分享到:
评论

相关推荐

    Spring5 框架 ---- IOC容器 ---- 代码

    Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- ...

    Spring-ioc-jar

    这个jar文件"Spring-ioc-jar"包含了实现Spring IOC功能所需的关键类和接口,是学习和使用Spring IOC技术的基础。 Spring框架的IOC容器是其核心组件,主要由`ApplicationContext`和`BeanFactory`两个接口代表。`...

    maven-spring-ioc

    **Spring IoC 框架详解** Spring框架是Java开发中的一个核心组件,它提供了许多功能,其中最重要的一项就是Inversion of Control(IoC),也称为Dependency Injection(DI)。IoC容器是Spring的核心,它负责管理...

    spring-context-3.2.0 spring-core-3.2.0 等齐全的Spring jar包

    1. **spring-core-3.2.0.RELEASE.jar**:这是Spring框架的核心模块,提供了基本的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)功能,以及资源加载和通用工具类。 2. **spring-...

    Spring----IOC实现

    Spring框架是Java开发中不可或缺的一部分,它以IoC(Inversion of Control,控制反转)为核心,极大地简化了软件组件的管理。在这个名为“Spring---IOC实现”的项目中,我们将深入探讨Spring如何通过IoC实现对应用...

    spring-security-web源码所需jar包

    1. **spring-context-3.1.2.RELEASE.jar**:提供Spring的IoC(Inversion of Control)容器和AOP(Aspect Oriented Programming)支持,这是Spring框架的基础,为Spring Security提供了配置和事件处理能力。...

    Spring-MVC+Spring-IOC+Spring-JdbcTemple

    标题“Spring-MVC+Spring-IOC+Spring-JdbcTemple”揭示了这个项目或教程是关于如何集成并使用Spring框架的三个核心模块:Spring MVC、Spring IOC(Inversion of Control,控制反转)以及Spring JDBC Template。...

    spring-framework-5.0.0.RELEASE-dist.zip

    Spring的核心模块提供了如IoC(Inversion of Control,控制反转)容器、AOP代理、事件传播、资源处理等功能。同时,它还可能包含Spring与其他技术的集成,如Spring JDBC、Spring ORM(对象关系映射)用于数据库操作...

    spring-framework-master

    Spring的核心设计理念是依赖注入(Dependency Injection,简称DI),它通过反转控制(Inversion of Control,IoC)来降低组件之间的耦合度。这种设计模式使得应用程序的配置和业务逻辑分离,从而提高了代码的可测试...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.jar

    Spring框架的核心是IoC(Inversion of Control)容器,它负责管理对象的生命周期和依赖关系。当需要使用CGLIB或Objenesis创建代理对象时,Spring容器会根据配置和上下文信息,动态地生成并管理这些代理对象。 6. *...

    spring-framework-1.0-with-dependencies.zip

    在Spring 1.0版本中,核心概念主要围绕IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)展开。IoC使得对象的创建和管理由Spring容器负责,而不是由代码直接创建,这样降低...

    Spring-IOC笔记

    spring-IOC的一些笔记心得

    spring-aop-5.1.0.RELEASE.jar

    spring-**cntext**-4.3.6.RELEASE.jar:spring提供了基础IOC功能上的扩展服务,提供了很多企业级服务的支持,如邮件服务,任务调度,JNDI定位,EJB集成,远程访问,缓存以及各种试图层框架的封装等。 spring-...

    官方原版完整包 spring-framework-5.3.1.RELEASE.zip

    1. **spring-core**: 提供了基础的IoC(Inversion of Control)容器,它是Spring框架的核心。IoC允许开发者通过配置来管理对象的生命周期和依赖关系,使得代码更加松耦合。 2. **spring-beans**: 支持Bean工厂和XML...

    Spring-4.0.3jar包

    Spring框架是Java开发中的核心组件,它以IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)为核心,极大地简化了企业级应用的开发工作。Spring-4.0.3是Spring框架的一个...

    Spring-IOC实现

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交由Spring容器处理,使得开发者可以更专注于业务逻辑的编写,而不是对象的生命周期管理。下面,我们将深入探讨Spring...

    spring 3.2.4.RELEASE jar包

    spring 3.2.4 Realease 的所有jar包: spring-context-3.2.4.RELEASE.jar spring-core-3.2.4.RELEASE.jar spring-beans-3.2.4.RELEASE.jar spring-test-3.2.4.RELEASE.jar spring-web-3.2.4.RELEASE.jar spring-aop-...

    spring-ioc学习

    spring-ioc学习 新手可以下过来学习下, spring-ioc简介

    Java-Spring-SpringIoC容器-SpringIoC的学习

    在Java Spring框架中,Spring IoC(Inversion of Control,控制反转)是核心特性之一,它使得应用程序的组件之间的依赖关系不再由代码直接管理,而是交由Spring IoC容器负责。这种设计模式降低了代码间的耦合,提高...

    spring-framework-5.1.2.RELEASE.rar

    其中,有4个是Spring的基础包,对应Spring核心容器的4个模块,是Spring项目...spring-context-5.1.8.RELEASE.jar //提供在基础IoC上的扩展服务 spring-expression-5.1.8.RELEASE.jar //提供对Spring表达式语言的支持

Global site tag (gtag.js) - Google Analytics