spring框架是一个开源的轻量级的基于IOC与AOP核心技术的容器框架,主要是解决企业的复杂操作实现。

那IOC与AOP,到底如何解释呢,在看spring视频中,两个专业术语一定必须要懂得。

IOC:inverse of Control:控制反转。意思是程序中的之间的关系,不用代码控制,而完全是由容器来控制。在运行阶段,容器会根据配置信息直接把他们的关系注入到组件中。同样,这也是依赖注入的含义。依赖注入和控制反转其实是一个概念。只不过强调的不同而已,依赖注入强调关系的注入是由容器在运行时完成,而控制反转强调关系是由容器控制。其实本质是一样的。

用代码演示一下控制反转是如何实现的。

1。新建一个普通的java项目。

2。引入相应的jar包。Spring.jar,log4j-1.2.14.jar(提供日志功能的),commons-logging.jar

3。提供log4j.properties配置文件。(日志jar包可以不用添加)

4。提供配置文件ApplicationContext.xml文件

5。开始写代码。

  1. package ioc.iocsample;
  2. /**
  3. * 学校类
  4. * @author lhy
  5. *
  6. */
  7. public class School {
  8. private String name;
  9. public School(String name)
  10. {
  11. this.name=name;
  12. }
  13. public void printInfo()
  14. {
  15. System.out.println("该学校的名称是:"+name);
  16. }
  17. }
  1. package ioc.iocsample;
  2. /**
  3. * 学生类
  4. * @author lhy
  5. *
  6. */
  7. public class Student {
  8. public int id;
  9. public String name;
  10. private School school;
  11. public int getId() {
  12. return id;
  13. }
  14. public void setId(int id) {
  15. this.id = id;
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. public School getSchool() {
  24. return school;
  25. }
  26. public void setSchool(School school) {
  27. this.school = school;
  28. }
  29. }

配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xmlns:tx="http://www.springframework.org/schema/tx"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
  8. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
  9. <bean id="school" class="ioc.iocsample.School">
  10. <constructor-arg index="0">
  11. <value>廊坊师院</value>
  12. </constructor-arg>
  13. </bean>
  14. <bean id="student" class="ioc.iocsample.Student">
  15. <property name="id"      value="001"/>
  16. <property name="name" value="张三"/>
  17. <property name="school"  ref ="school"/>
  18. </bean>
  19. </beans>

客户端进行测试,其中学生类Student中有School中的引用,测试该学生就读的学校的名称如下:

  1. package ioc.iocsample;
  2. import org.springframework.beans.factory.BeanFactory;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class Client {
  5. public static void main(String[] args) {
  6. // TODO Auto-generated method stub
  7. BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
  8. Student student=(Student)factory.getBean("student");
  9. student.getSchool().printInfo();
  10. }
  11. }

其中,在程序中不用实例化学生类,学校类,直接由容器中的beanFactory直接创建,隐藏了创建了细节。同时,程序中也不用关心学生类与学校类之间的依赖关系,而由容器来进行负责,在运行的时候,容器会把属性值及依赖关系注入学生类和学校类中的javabean中(其实在此School和Student就是一个javaBean。javaBean就是一个按照一定的原则封装的java类而已。)

其中依赖注入包括两种:一种赋值注入(使用getter和setter方法);另一种使用构造器注入。

看程序中student中的ID,name都是使用get,set来赋值的:那在配置文件是如下配置:

<property name="id"      value="001"/>
       <property name="name" value="张三"/>

并且Student中的school属性是School类型,则在容器中是如下配置的:

<property name="school"  ref ="school"/>

而在程序中的School中的name是构造器赋值的,则容器中是如下配置的:

<constructor-arg index="0">
         <value>廊坊师院</value>
      </constructor-arg>

构造器中一个参数,则索引值是从0开始,若是有多个,依次递增。

若构造器中的是一个类,则使用bean标签

<constructor-arg index="0">

<bean class="具体的类">

</constructor-arg>

spring中的依赖注入DI(dependence injection)共有三种方式:第一种是接口注入(Interface Injection)第二种是get set注入(set/get Injection)第三种是构造器注入(Constructor Injection)

三种注入方式的区别:

1.接口注入:组件需要依赖特定接口的实现,其中的加载接口实现和接口实现的具体对象都是由容器来完成。这样,接口必须依赖容器,这样的组件具有侵入性,降低了重用性。其中如J2EE开发中常用的Context.lookup(ServletContext.getXXX),都是接口注入的表现形式。(这种注入方式不是常用的)

2.getter/setter方式注入:对于需要注入的东西比较明确。符合java的设计规则。更适合java开发人员,使用起来更加自然,更加方便。

3.构造器方式注入:在类加载的时候,就已经注入依赖的组件。但是若是参数多的话,使用起来不方便。

但是后两种注入方式是spring常用的,而第一种接口注入方式不常用。

spring学习(一)——控制反转简单例子的更多相关文章

  1. Spring学习3—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)

    一.思想理解 Spring 能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的 管理下有机地协调.运行.S ...

  2. Spring学习3—控制反转(IOC)基于Annotation(注解)的依赖注入实现

    一.依赖注入--手工装配—注解方式 在java代码中使用@Autowired或@Resource注解方式进行装配的前提条件是:   1.引入context命名空间 需要在xml配置文件中配置以下信息: ...

  3. Spring学习02——控制反转、依赖注入

    有两个人,张三和李四 package com.su.service; public class ZhangSan implements Tester{ public void test(){ Syst ...

  4. 谈谈对Spring IOC(控制反转)的理解--转

    谈谈对Spring IOC(控制反转)的理解--转   学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC ...

  5. Spring框架系列(3) - 深入浅出Spring核心之控制反转(IOC)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了IoC的基础含义,同时以此发散了一些IoC相关知识点; 本节将在此基础上进一步解读IOC的含义以及IOC的使用方式.@pd ...

  6. Spring中的控制反转和依赖注入

    Spring中的控制反转和依赖注入 原文链接:https://www.cnblogs.com/xxzhuang/p/5948902.html 我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达 ...

  7. 轻松了解Spring中的控制反转和依赖注入(二)

    紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类 ...

  8. Helloworld之Spring依赖注入/控制反转(DI/IoC)版

    Helloworld之Spring依赖注入/控制反转(DI/IoC)版 作者:雨水, 日期:2014-10-29 摘要:本文主要用于培训刚開始学习的人理解Spring中的依赖注入的基本概念. 先介绍依 ...

  9. spring中的控制反转

    为什么使用spring框架,控制反转是它的重要优势之一. 传统的程序设计中,某个对象需要被调用时(比如mvc模式中controller调用service),需要调用者自己创建被调用对象. 而在spri ...

随机推荐

  1. 纯JS实现前端动态分页码

    思路分析:有3种情况 第一种情况,当前页面curPage < 4 第二种情况,当前页面curPage == 4 第三种情况,当前页面curPage>4 此外,还要考虑,当前页码 curPa ...

  2. JSON与Delphi Object的互换

    Delphi自从增强了RTTI后,语言的可灵活性多大增强,Delphi的dbExpress中提供了DBXJSON,和DBXJSONReflect两个单元,可提供JSON序列化 下面的例子是实现Delp ...

  3. VMWARE虚拟机中CentOs7网络连接

    1.选择网络连接模式 这里选择NAT模式 2.查看虚拟机逻辑地址段 编辑---->虚拟网络编辑器 这里显示的是192.168.40.0 我们本机占用了192.168.40.1,网关是192.16 ...

  4. 5、GDB调试工具的使用

    GDB是GNU发布的一款功能强大的程序调试工具.GDB主要完成下面三个方面的功能: 1.启动被调试程序. 2.让被调试的程序在指定的位置停住. 3.当程序被停住时,可以检查程序状态(如变量值). #i ...

  5. rails应用无法读取kafka数据报错Kafka::Error: Failed to find group coordinator

    如果确保kafka中有数据,rails应用中却无法读取到,或报如下错误: Kafka::Error: Failed to find group coordinator   一般有两种情况,解决:   ...

  6. Go语言中的变量

    1 概述 变量(Variable)是程序运行过程中,内容可以变化(修改)的量,变量的功能是存储用户的数据,是计算机语言中能储存计算结果或能表示值抽象概念.变量,是通过变量的标识符定位值的过程.变量的内 ...

  7. Codeforces Round #490 (Div. 3) :F. Cards and Joy(组合背包)

    题目连接:http://codeforces.com/contest/999/problem/F 解题心得: 题意说的很复杂,就是n个人玩游戏,每个人可以得到k张卡片,每个卡片上有一个数字,每个人有一 ...

  8. browser-cookies 一个管理cookies的插件,好用

    一.browser-cookies 地址:https://github.com/voltace/browser-cookies 用法 存放cookies是 cookies.set('firstName ...

  9. google friendly testing

    https://www.google.com/webmasters/tools/mobile-friendly/?mc_cid=cc21b18877&mc_eid=cf2bbeb9b2 htt ...

  10. 成都Uber优步司机奖励政策(3月31日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...