首页 > 其他分享 >Spring 学习笔记(1)—— 通过一个小例子体会 IoC 的概念

Spring 学习笔记(1)—— 通过一个小例子体会 IoC 的概念

时间:2023-06-06 22:01:54浏览次数:48  
标签:MoAttack Spring void 笔记 class GeLi geli IoC public


《墨攻》中的一个场面,刘德华所饰演的墨者——革离,到达梁国都成下时候,城上的梁国守军问道:“来者何人?”,刘德华回答:“墨者革离!”

使用Java语言为这个场景“城门叩问”的场景编写剧本。


革离是《墨攻》剧本中一个角色,我们用一个接口(interface)来表示这个角色

GeLi.java

package com.smart.ioc;

public interface GeLi {
    void responseAsk(String saying);
}

刘德华是一个饰演的革离的演员,我们一个类(class)来实现(implement)上边的接口

LiuDeHua.java

package com.smart.ioc;

public class LiuDeHua implements GeLi {

    public void responseAsk(String saying) {
        System.out.println(saying);
    }
}

属性注入

接下来用一个类来表示我们墨攻的剧本

MoAttack.java(属性注入方式)

package com.smart.ioc;

public class MoAttack{

    private GeLi geli;

    // 属性注入
    public void setGeli(GeLi geli) {
        this.geli = geli;
    }

    void cityGateAsk() {
        geli.responseAsk("墨者革离");
    }
}

MoAttack 和 LiuDeHua 实现了解耦,MoAttack 无需关注角色实现类的实例化工作。


通过容器完成依赖关系的注入

在 Spirng 配置文件对以上实例进行配置:

MoAttack-a.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"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

    <!-- 通过容器完成依赖关系的注入 -->

    <bean id="liudehua" class="com.smart.ioc.LiuDeHua" />

    <!-- 方式一 -->
    <!--<bean id="moAttack" class="com.smart.ioc.MoAttack"-->
        <!--p:geli-ref="liudehua"/>-->

    <!-- 方式二 -->
    <bean id="moAttack" class="com.smart.ioc.MoAttack">
        <property name="geli" value="liudehua" />
    </bean>

    <!-- 两种注入方式效果相同 -->
</beans>

测试效果

MoAttackTest.java

package com.smart.ioc;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ={"/MoAttack-a.xml"})
public class MoAttackTest {

    @Autowired
    private MoAttack moAttack;

    @Test
    public void MoAttackTest() throws Exception{
        moAttack.cityGateAsk();
    }
}


//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(locations ={"/MoAttack-a.xml"})
//public class MoAttackTest {
//
//    @Resource
//    private MoAttack moAttack;
//
//    @Test
//    public void MoAttackTest() throws Exception{
//        moAttack.cityGateAsk();
//    }
//}


//public class MoAttackTest {
//    @Test
//    public void MoAttackTest() throws Exception{
//        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("MoAttack-a.xml");
//        context.start();
//        MoAttack moAttack = (MoAttack) context.getBean("moAttack");
//        moAttack.cityGateAsk();
//    }
//}

构造器注入

GeLi.java 和 LiuDeHua.java 文件无需改动

MoAttack.java(构造器注入)

package com.smart.ioc;

public class MoAttack{

    private GeLi geli;

    // 属性注入
    public void setGeli(GeLi geli) {
        this.geli = geli;
    }

    // 构造器注入
    public MoAttack(GeLi geLi){
        this.geli = geLi;
    }

    void cityGateAsk() {
        geli.responseAsk("墨者革离");
    }
}

MoAttack-a.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"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

    <!-- 通过容器完成依赖关系的注入 -->

    <bean id="liudehua" class="com.smart.ioc.LiuDeHua" />

    <!-- 属性注入的两种配置方式 -->
    <!-- 方式一 -->
    <!--<bean id="moAttack" class="com.smart.ioc.MoAttack"-->
        <!--p:geli-ref="liudehua"/>-->

    <!-- 方式二 -->
    <!--<bean id="moAttack" class="com.smart.ioc.MoAttack">-->
        <!--<property name="geli" value="liudehua" />-->
    <!--</bean>-->
    <!-- 两种注入方式效果相同 -->

    <!-- 构造器注入 -->
    <bean id="moAttack" class="com.smart.ioc.MoAttack">
        <constructor-arg index="0" ref="liudehua" />
    </bean>

</beans>

项目的目录结构

Spring 学习笔记(1)—— 通过一个小例子体会 IoC 的概念_spring


标签:MoAttack,Spring,void,笔记,class,GeLi,geli,IoC,public
From: https://blog.51cto.com/u_16152603/6428543

相关文章

  • Spring 学习笔记(12)—— AOP 基础
    AOP到底是什么AOP术语创建增强类......
  • python笔记
    python官方文档6.6的代码:frommaiximportcamera,mjpg,displayimportsocket#host_name='192.168.4.1'shuzu=bytearray(57600)#bytes是不能被修改的#s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#地址簇:AF_INET(IPv4)类型:SOCK_STREAM(使用TCP传输控......
  • SpringMVC
    SpringMVCModel:模型业务逻辑层+数据访问层View:视图jsphtmlController:控制器servlet介绍SpringMVC是一种基于Java实现MVC模型的轻量级Web框架,SpringMVC已经成为目前最主流的MVC框架之一,从Spring3.0的发布,就已全面超越Struts2,成为最优秀的MVC框架。它通过一......
  • 构建之法阅读笔记01
    阅读代码大全有感: 在我的软件开发经验中,我经常会写出冗长且难以理解的代码。我认为将所有功能都放在一个函数或者一个类中是最简单的方法,同时也不需要处理代码的复杂性。但是,在读完《代码大全》后,我意识到这种做法会导致代码的可维护性降低,而且使代码的重复性也增加。 根据书......
  • 构建之法阅读笔记02
    人月神话读书有感:在我的软件开发经验中,我曾经认为增加人力就能够加快软件开发速度。但是,我在读完《人月神话》后,意识到这种做法是错误的。根据书中的描述,增加开发人员的数量并不一定能加速软件开发的进度,反而可能会延迟项目的完成时间。这是因为在一个时间节点上,有很多的......
  • 构建之法阅读笔记03
    阅读《人件》有感:在我的学习中,我曾经认为技术才是软件开发中最重要的方面。因此,我在项目学习中更注重了技术层面,而忽视了人性层面。然而,通过阅读《人件》这本书,我意识到这种做法是错误的。根据书中的描述,技术是软件开发中非常重要的一部分,但是人性因素同样重要。充分考虑......
  • 「学习笔记」对拍
    在考试中,我们对于一道题目,一般会有两份代码,一份暴力,一份正解。只有一份的情况不算这时,我们需要通过自己造数据来检查我们的正解是否正确,当然,在此之前,请先确保你的暴力是正确的。下面是一份暴力的代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;co......
  • Spring和Mybatis
    Mybatis和springMyBatis第一个程序搭建数据库CREATEDATABASE`mybatis`;USE`mybatis`;DROPTABLEIFEXISTS`user`;CREATETABLE`user`(`id`int(20)NOTNULL,`name`varchar(30)DEFAULTNULL,`pwd`varchar(30)DEFAULTNULL,PRIMARYKEY(`id`))......
  • Spring框架中事务控制的运行原理
    PhotobyTomaszFilipekfromPexels:https://www.pexels.com/photo/nature-photography-of-flower-field-1646178/SpringTransaction基本介绍我们在日常开发中经常使用Spring框架来实现事务管理。事务管理是指在执行一系列操作时,保证这些操作要么全部成功,要么全部失败,不......
  • Unity URP简单笔记by me
    URP的特点相对于内置管线,具有更好的性能和更高的画质更好的跨平台性,能在VR、移动端、PC端、主机端保持接近的性能与效果和HDRP一样,是基于SRP的可定制渲染管线,在多个方面具有更好的自定义性可以使用连连看ShaderGraph 需要掌握URP的新知识如何将内置管线转换为URP(导入......