当前位置: 首页 > news >正文

spring4第2课-ioc控制反转

继续学习ioc控制反转,

IOC(Inversion of Control)控制反转,也叫依赖注入,

    目的是解决程序的耦合问题,轻量级spring的核心。

1.定义bean.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--定义2个bean:zhangsan和lisi--><bean id="zhangsan" class="com.java1234.service.ZhangSan"></bean><bean id="lisi" class="com.java1234.service.Lisi"></bean>

  <!--定义实现业务逻辑的bean类JavaWork--><bean id="javaWork" class="com.java1234.service.JavaWork">
     <!-- tester是javaWork的一个属性。(对应JavaWork类的这一行代码: private Tester tester;)--> <property name="tester" ref="lisi"></property><!-- 上面这一行作用是给tester 注入了1个值[lisi],也是依赖注入的说法来源-->
       <!--上面这句话就是调用class对应的类(com.java1234.service.JavaWork)中的setTester方法,相当于执行【this.tester = lisi;】,使得tester这个属性绑定了具体对象lisi--><!-- 如果不想用lisi ,ref后面的值可以改成zhangsan,代码如下:<property name="tester" ref="zhangsan"></property>-->
</bean><!--补充说明:在spring出现之前,这一段tester和ref绑定的过程要在java代码实现,/*ZhangSan zhangsan=new ZhangSan();zhangsan.test();*/或者 /*Lisi lisi=new Lisi();lisi.test();*/上面的代码侵入了java程序,不利于扩展性,每次逻辑变动需要改java代码,使用spring后只要改这里bean.xml的ref配置-->
</beans>

2.接口类Tester

package com.java1234.service;public interface Tester {public void test();
}

3. 接口实现类2个:ZhangSan 和Lisi

接口实现类1:ZhangSan

package com.java1234.service;public class ZhangSan implements Tester{public void test(){// 张三是测试员System.out.println("张三-测试程序");}
}

接口实现类2:Lisi  

package com.java1234.service;public class Lisi implements Tester{public void test(){System.out.println("李四-测试程序");}
}

4.实现业务逻辑的类JavaWork 

package com.java1234.service;public class JavaWork {private Tester tester;public void setTester(Tester tester) {this.tester = tester;}public void doTest(){/* 方案1:不用spring的代码(不依赖bean.xml),缺点:有侵入业务逻辑,实现代码见下方  *//*ZhangSan zhangsan=new ZhangSan();zhangsan.test();*//*Lisi lisi=new Lisi(); Lisi.test();*//* 方案2:使用spring,需修改bean.xml内容,优点是无侵入逻辑,不管是张三还是李四,不改动这里代码 */tester.test();}
}

5. 执行main主类,可以调用实体类对象javaWork(类型是JavaWork)的doTest方法

package com.java1234.test;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.java1234.service.JavaWork;public class Test {public static void main(String[] args) {
//方案1:不使用spring的java原生态写法如下(不依赖bean.xml):JavaWork javaWork = new JavaWork();javaWork.setTester(new ZhangSan());// 或者 javaWork.setTester(new Lisi());javaWork.doTest();//方案2:使用spring的java原生态写法如下(需要配置bean.xml):ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");JavaWork javaWork=(JavaWork)ac.getBean("javaWork");javaWork.doTest();}
}

执行结果:

如果bean.xml配置的是 <property name="tester" ref="zhangsan"></property>

   效果就是打印出:张三-测试程序

如果bean.xml配置的是 <property name="tester" ref="lisi"></property>

   效果就是打印出:李四-测试程序

相关文章:

  • 医疗HMI设计规范解读:如何平衡合规性与用户体验?
  • 每日Prompt:古花卷
  • MySQL-5.7 修改密码和连接访问权限
  • 顶会新方向:卡尔曼滤波+目标检测
  • 从“超市收银系统崩溃”看JVM性能监控与故障定位实战
  • wordpress迁移到Hostinger
  • 【监控】pushgateway中间服务组件
  • MES生产管理系统:Java+Vue,含源码与文档,集成生产信息,实现计划、执行与监控高效协同
  • AbMole| MGCD0103(M1790,Mocetinostat)
  • 【Elasticsearch】retry_on_conflict
  • Linux:基础指令与内涵理解(下)与权限
  • [AI]大模型MCP快速入门及智能体执行模式介绍
  • Linux `cd` 命令深度解析与高阶应用指南
  • Babylon.js学习之路《九、物理引擎入门:重力、碰撞与刚体模拟》
  • (aaai2025) Towards Open-Vocabulary Remote Sensing Image Semantic Segmentation
  • 全局事务标识符
  • mapbox-gl-draw simple_select 状态下单个选中
  • linux安装MYSQL
  • android平台驱动开发(四)--系统属性节点控制GPIO
  • 【数据库】-4 mysql权限语句
  • 网吧设计公司/seo是什么意思 职业
  • 6网站建设做网站/培训班有哪些
  • 网站建设便宜的公司哪家好/创意营销点子
  • 四川住房建设厅网站/百度公司招聘岗位
  • 那些公司做网站好/关键词怎样做优化排名
  • 做网站用织梦好吗/怎么建立网站卖东西