开始之前:

1. 本博文为原创,转载请注明出处

2. 作者非计算机科班出身,如有错误,请多指正

---------------------------------------------------------------------------开始啦啦啦啦啦-------------------------------------------------------------------------------

从开始接触spring起,听到最多的就是Ioc(控制反转)和AOP(面向切面编程)啦。Spring的官方文档给出了这样一个框架图(><看起来好深奥~~)。不过本篇要介绍的所谓的控制反转,就是通过core里面的bean以及context jar包实现的哦。其他的jar包会在之后的章节中讲到。

控制反转,也可以称之为依赖注入(dependency injection),指的是当依赖被创建,或从工厂里获得以后,其他类可以通过构造方法,工厂方法,或set方法得到此依赖。通俗一点的说,就是一个类里面依赖的创建及使用,不需要在类本身new出此依赖,只要注入即可使用。举个例子,我有一辆汽车,需要燃油才能发动,然而我总不能自己去开采燃油,我只需要去加油站加点油,不管你是中石油还是壳牌油,总之油注入进来了,车就可以发动了。这里的燃油就是一个依赖类,这样可以被注入的依赖类,我们称之为bean,而对bean进行初始化,配置和集成操作的,我们称之为Ioc容器(类似于加油站了)。Ioc容器的编译可以使用xml,Java注解或Java程序来实现。虽然本人更喜欢注解的方式(尤其是使用了Spring Boot),但是入门起见,还是用xml掌握一下基础知识再根据心情选方式吧~

那么问题来啦,bean到底是咋创建的呢?下面给出了简单的bean的定义结构

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions go here -->

</beans>

这是一段简单的xml代码,可以看到beans里面定义了很多的bean,每个bean都映射到一个类,这些类就是你所要使用的依赖啦。下面我们来看容器和beans是怎么关联的。

ApplicationContext context =
    new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});

这里的ApplicationContext是context jar包里面的容器接口,它读取了两个xml文件作为容器的配置,来完成各种bean的创建与关联。

让我们来实际操作一下,首先定义两个xml的文件

service.xml (service里面有一个依赖叫做petStore,而petStore里面又有两个依赖accountDao和itemDao,他们是在其他文件里面创建的bean,在service.xml里面被注入进来)

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">

    <!-- services -->

    <bean id="petStore" class="com.dabingguozi.generaltest.pojo.PetStoreService">
        <property name="accountDAO" ref="accountDAO"/>
        <property name="itemDAO" ref="itemDAO"/>
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for services go here -->

</beans>

daos.xml (service中petStore所注入的依赖accountDao和itemDao在这里创建)

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">

    <bean id="accountDAO"
          class="com.dabingguozi.generaltest.pojo.AccountDAO">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <bean id="itemDAO" class="com.dabingguozi.generaltest.pojo.ItemDAO">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for data access objects go here -->

</beans>

最后,不要忘记了,在Java里面定义你的三个类(PetStoreService.java, ItemDAO.java, AccountDAO.java注意要包含set方法)和你的主程序(如下)

public class App {
    public static void main(String[] a){
        ApplicationContext context =
                new ClassPathXmlApplicationContext(new String[] {"daos.xml", "services.xml"});
// retrieve configured instance
        PetStoreService service = context.getBean("petStore", PetStoreService.class);
// use configured instance
        List<String> userList = service.getUsernameList();
        System.out.print(userList);
    }
}

如有报错,看看是不是jar包没有导入,本人使用maven管理lib,详见:https://mvnrepository.com/artifact/org.springframework

在Intellij里面试一试,看看是不是我们想要的效果呢?

我们成功的打出了依赖的类名。散花^^如此一来,我们的Spring之旅正式开始啦~~

下一篇:Spring学习之Ioc控制反转(2)

下一篇继续研究控制反转中bean定义的一些内容,博主首博,诚谢观看。

本博客内容参考spring framework官方文档,如有冲突,请参照原版内容

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/index.html

Spring学习之Ioc控制反转(1)的更多相关文章

  1. Spring学习之Ioc控制反转(2)

    开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...

  2. Spring框架之IOC(控制反转)

    [TOC] 第一章Spring框架简介 IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向 ...

  3. Spring框架中IoC(控制反转)的原理(转)

    原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...

  4. Spring源码——IOC控制反转

    1.基础知识 Spring有两个核心功能,分别是ioc和aop,其中ioc是控制反转,aop是切面编程. 在ioc中,还有一个名次叫DI,也就是依赖注入.嗯,好像IOC和DI是指同一个,好像又感觉他俩 ...

  5. Spring第一课:IOC控制反转,什么是反转,什么又是控制?

    前言 学习Spring第一课,就是认识IOC控制反转,要了解它还真得花一些功夫.今天主要理解透彻它的真谛,而不仅限于表面. 上道小菜 public class BusinessService { pr ...

  6. Spring 什么是 IOC 控制反转 ?什么是依赖注入?spring的用处 好处 为什么要用

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha Spring是一个开源的控制反转(Inversion of Control ,IoC)和 ...

  7. 零基础带你看Spring源码——IOC控制反转

    本章开始来学习下Spring的源码,看看Spring框架最核心.最常用的功能是怎么实现的. 网上介绍Spring,说源码的文章,大多数都是生搬硬推,都是直接看来的观点换个描述就放出来.这并不能说有问题 ...

  8. spring学习总结一----控制反转与依赖注入

    spring作为java EE中使用最为广泛的框架,它的设计体现了很多设计模式中经典的原则和思想,所以,该框架的各种实现方法非常值得我们去研究,下面先对spring中最为重要的思想之一----控制反转 ...

  9. Spring学习笔记——01 控制反转

    想一下之前学的Java,如果某个类需要引用某个对象,则需要手动new一个出来.这样带来的一个问题就是,若被引用的类发生改动或被删除,则引用它的所有类都会报错.因为两个类耦合在一起了.解决的办法就是不由 ...

随机推荐

  1. 文摘:威胁建模(STRIDE方法)

    文摘,原文地址:https://msdn.microsoft.com/zh-cn/magazine/cc163519.aspx 威胁建模的本质:尽管通常我们无法证明给定的设计是安全的,但我们可以从自己 ...

  2. 1203.4——循环语句 之 for

    for循环的一般形式为:for(表达式1; 表达式2; 表达式3){    语句块} 它的执行过程如下:1) 先求解表达式1. 2) 求解表达式2,若其值为真(非0),则执行循环体,否则结束循环. 3 ...

  3. struts2 实现过程和xml配置

    实现过程: 当Web容器收到 请求(HttpServletRequest)它将请求传递给一个标准的的过滤链包括 (ActionContextCleanUp)过滤器,然后经过Other filters( ...

  4. 跨平台渲染框架尝试 - GPU Buffer的管理(1)

    buffer资源 下面来谈谈buffer的管理.buffer资源从广义上就是C语言的数组.如下图所示. 图 buffer的广义模型 在渲染管线中,无论是opengl还是dx或者其他的渲染api,都会提 ...

  5. java基础知识1

    58.线程的基本概念.线程的基本状态以及状态之间的关系线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身.Java中的线程有四种状态分别是:运行.就绪.挂 ...

  6. Hibernate之通过hibernate.cfg.xml配置文件访问数据库的例子

    hibernate.cfg.xml文件内容: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...

  7. mysql导入.sql文件

    1. source /home/susie ...../**.sql 2. \. /home/susie/.../**.sql 批量导入.sql文件 首先新建一个main.sql,然后在main.sq ...

  8. deepin软件中心打不开

    想体验下deepin新特性,就修改了软件源为test版本,结果就坑了,软件中心打不开了...无奈之下,看了下论坛,找到了官方源地址,然后替换. sudo gedit /etc/apt/sources. ...

  9. C++中利用libxl操作Excel表格

    libxl是一款操作excel的商业库,支持C.C++.C#和Delphi.下文利用libxl在C++中实现了从excel文档的表1中随机挑选记录,保存到新建的表中.以下为代码: #include & ...

  10. C++----练习--while求和

    1.完成1+2+3+...+99+100 #include<iostream> int main() { std::cout<<"本程序完成1 + 2 + 3 ... ...