zoukankan      html  css  js  c++  java
  • Spring入门(二)

    Spring IOC&DI

    控制反转(inversion of control):控制什么?什么反转?

      我们都知道,传统的程序中,如果A类需要使用B类对象,会在程序中直接创建B类对象实例,此时创建对象的控制权在A类手上;但现在出现了一个IOC/DI容器,由IOC/DI容器代替A类执行实例化B类的权利,所谓控制权由A类转向IOC容器,即控制反转。

    依赖注入(Dependency Injection):什么是依赖,谁依赖谁,什么是注入,谁注入,注入哪里?

      依赖就是依靠依附(鱼依赖水),对象依赖IOC/DI容器,注入:IOC/DI容器将某个对象的资源注入到所需要该对象资源的对象中;从IOC/DI容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入他所依赖的实例。

    总结:控制反转是原则,依赖注入是实现,控制反转的从程序角度出发描述概念,依赖注入从Spring容器角度出发描述概念。

    Spring IOC实现

      BeanFactory:提供完整的Ioc服务支持,是一个管理Bean的工厂,负责初始化各种bean,有多个实现类,例如:XmlBeanFactory(该类根据XML配置文件中的定义来装配Bean)

      ApplicationContext:是BeanFactory的子接口,除了支持BeanFactory的功能外,还支持国际化,资源访问等内容

    创建ApplicationContext接口实例的方法有三种

    1. ClassPathXmlApplicationContext(相对路径)
    2. FileSystemXmlApplicationContext(绝对路径)
    3. 通过Web服务器实例化ApplicationContext(web.xml文件中) 此种方式自己还未理解什么意思

    依赖注入类型

    使用构造方法注入

      Dao&DaoImpl

    public interface TestDIDao {
        void sayhello();
    }
    
    import com.dao.TestDIDao;
    public class TestDIDaoImpl implements TestDIDao{
        @Override
        public void sayhello() {
            System.out.println("Hello World!");
        }
    }

      Service&ServiceImpl

    public interface TestDIService {
        public void sayHello();
    }
    
    public class TestDIServiceImpl implements TestDIService {
        public TestDIDao testDIDao;
        //构造方法,用于实现依赖注入接口对象testDIDao
        public TestDIServiceImpl(TestDIDao testDIDao) {
            super();
            this.testDIDao = testDIDao;
        }
        @Override
        public void sayHello() {
            //调用testDIDao中的sayHello方法
            testDIDao.sayhello();
            System.out.println("TestDIService依赖注入调用TestDIDao中的方法....");
        }
    }

      Xml

    <!-- 将指定的类TestDaoImpl配置给Spring,让Spring创建该实例 -->
    <bean id="testDIDao" class="com.dao.impl.TestDIDaoImpl" />
    <!-- 使用构造方法注入 -->
    <bean id="testDIService" class="com.service.impl.TestDIServiceImpl">
         <!--将myTestDADao注入到TestDIServiceImpl类的属性testDIDao上-->
       <constructor-arg index="0" ref="testDIDao"></constructor-arg>
    </bean>

      Test

    //测试用构造器方式注入
    //初始化spring容器ApplicationContext,加载配置文件
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    //通过容器获取testDIService实例,测试构造方法注入
    TestDIService testDIService = (TestDIService) context.getBean("testDIService");
    testDIService.sayHello();

    使用属性注入

      Dao&DaoImpl

    public interface TestDIDao {
        void sayhello();
    }
    
    import com.dao.TestDIDao;
    public class TestDIDaoImpl implements TestDIDao{
        @Override
        public void sayhello() {
            System.out.println("Hello World!");
        }
    }

      Service&ServiceImpl

    public interface TestDIService {
        public void sayHello();
    }
    
    public class TestDIServiceImpl implements TestDIService {
      public TestDIDao testDIDao;
        //使用setter方法实现注入
        public void setTestDIDao(TestDIDao testDIDao) {
            this.testDIDao = testDIDao;
        }
        @Override
        public void sayHello() {
            //调用testDIDao中的sayHello方法
            testDIDao.sayhello();
            System.out.println("TestDIService依赖注入调用TestDIDao中的方法....");
        }
    }

    XML

    <!-- 将指定的类TestDaoImpl配置给Spring,让Spring创建该实例 -->
    <bean id="testDIDao" class="com.dao.impl.TestDIDaoImpl" />
    <!-- 使用属性方法注入 -->
    <bean id="testDIService" class="com.service.impl.TestDIServiceImpl">
      <!-- 调用TestDIServiceImpl类的setter方法,将myTestDADao注入到TestDIServiceImpl类的属性testDIDao上 -->
      <property name="testDIDao" ref="testDIDao"></property>
    </bean>

    Test

    //测试用属性方式注入
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    TestDIService testDIService = (TestDIService)context.getBean("testDIService");
    testDIService.sayHello();

     参考博文:

      https://blog.csdn.net/doris_crazy/article/details/18353197

           https://www.cnblogs.com/zanpen2000/p/7810884.html

           https://www.cnblogs.com/leoo2sk/archive/2009/06/17/di-and-ioc.html

    同样在自学Spring的小伙伴,如果看到我的博客,希望留下你的联系方式,我们一起加油!!!

  • 相关阅读:
    arm64 boot
    python学习笔记
    字符编码问题详解
    Restful 架构设计
    调度器学习总结
    从0开始学习maven搭建spring+mybatis框架
    java内存管理
    linux 基础
    自学有感
    echart 图表显示技术
  • 原文地址:https://www.cnblogs.com/superhonors/p/11633964.html
Copyright © 2011-2022 走看看