Spring系列教程三: Spring Ioc容器详解

根据上一篇文章讲解内容建立对象有如下两种方式spring

1、主动去找资源经过实例化对象的方式,二者之间有必然联系,应用独立就变得比较难框架

IAccountService as=new AccountServiceImpl();

第二种、把获取联系的工做较给了第三方,BeanFactory从而避免了和AccountDao之间的必然联系函数

IAccountService as=(IAccountService) Beanfactory.getBean("accountService");

为何要叫控制反转?上面划线的部分原本本身是有独立的控制权限,想拿到那个对象就能拿到那个对象,可是它把本身的拿对象的权利转交给 一个BeanFactory的工厂类,具体能拿到那个对象是由getBean里面传进来的参数决定。ui

控制反转(Ioc)的概念

就是把建立对象的权利交给框架,是框架的重要特征,只是面向对象中的一种设计概念,它包括依赖注入和依赖查找,主要的做用是削减程序之间的耦合关系要是咱们本身来写控制反转的话就是可使用BeanFactory工厂模式(详细参考上一篇博客)来写,可是在设计开发中很明显会增长工做量,因此咱们会把这个工做交给Spring来作,Spring中Spring Core是框架最基础的部分,提供了Ioc的特性,Spring Ioc容器中主要包括BeanFactory 容器和ApplicationContext 容器spa

下面是使用Spring来进行控制反转的示例设计

首先咱们得下载Spring-framework的jar包,在pom文件里面进行下载3d

而后在根目录下面resoure文件中,建立一个xml配置文件,要想下降依赖关系只有经过反射来建立对象,而且把这任务交给Spring来建立code

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
    <!-- 上面的是约束,把对象的建立交给Spirng来管理,惟一标识id和全限定类名-->
    <bean id="accountService" class="com.ithema.jdbc.service.impl.AccountServiceImpl"></bean>
    <bean id="accountDao" class="com.ithema.jdbc.dao.impl.AccountDaoImpl"></bean>
</beans>

下面是表现层的实现代码xml

package com.ithema.jdbc.ui;
import com.ithema.jdbc.dao.IAccountDao;
import com.ithema.jdbc.factory.Beanfactory;
import com.ithema.jdbc.service.IAccountService;
import com.ithema.jdbc.service.impl.AccountServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 模拟一个表现层,用于调用业务层
 */
public class Client {
    public static void main(String[] args) {
        /**
         * 获取Spring Ioc的核心容器,而且根据id获取对象
         */
        //IAccountService as=new AccountServiceImpl();
       /* for (int i=0;i<5;i++){
            IAccountService as=(IAccountService) Beanfactory.getBean("accountService");
            System.out.println(as);
        }*/
        //as.saveAccount();
        //一、获取核心容器对象,new出来是它的实现类
        ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
        //二、根据id获取bean对象
        IAccountService as= (IAccountService) ac.getBean("accountService");
        IAccountDao adao= ac.getBean("accountDao",IAccountDao.class);//在IIAccountDao.class传入字节码,让字节码强转
        System.out.println(as);
        System.out.println(adao);
        as.saveAccount();
    }
}

最后是输出结果,成功的建立了两个对象,而且执行了业务service层的方法对象

补充一个小的知识点ApplicationContext接口的几个主要的实现类

* ApplicationContext的三个实现类
*    ClassPathXmlApplicationContext,它能够加载类路径下的配置文件,要求配置在类路径下,不在的话加载不了
*    FileSystemXmlApplicationContext 它是能够加载磁盘下任意路径的配置文件(必须有访问权限)
*    AnnotationConfigApplicationContext 它是读取注解建立容器
*/

同样可以读取到配置文件,可是咱们通常不建议这么作,配置文件通常都是和咱们项目放在一块儿的,若是其余人不知道万一给你删除了怎么办??

核心容器的两个接口引起出的两个问题
*    ApplicationContext:
*    它在建立核心容器采用的策略是当即加载的方式,也是就是说,有一读取完立刻就穿件配置文件的的对象
*   
*    BeanFactory:
*    它在建立核心容器时候的策略是采起延迟加载的方式,也就是说,何时根据ID获取对象了,何时才真正建立对象

 

ApplicationContex建立对象状况演示以下

首先、咱们要看到对象有没有建立,须要去接口实现类里面的构造函数输出一句话,对象被建立了!!建立对象是经过实例化构造函数所得!!

BeanFactory建立对象状况演示以下

执行结果以下

继续执行 step over

那么在实际的开发中咱们怎么去选择这两种Ioc容器的两种接口啦?具体状况具体分析

ApplicationContex适合于单例对象使用 ,BeanFactory使用于多例对象,可是在实际开发的过程当中咱们使用的是ApplicationContext接口建立

相关文章
相关标签/搜索