欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring入门笔记(二)IOC和DI

程序员文章站 2022-06-22 16:06:10
...

IOC和DI

  • IOC(控制反转):其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式

简单说对象与对象之间的依赖关系不是由一方来控制,而是由第三方来控制。
比如在servlet中创建service,由servlet来控制,缺点是service变化,servlet中也应跟着变化。

  • DI(依赖注入):IOC 的另一种表述方式,即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入. 相对于 IOC 而言,这种表述更直接。

IOC容器

spring为我们提供了两种类型的容器
BeanFactory是spring框架基础设施,面向spring本身;
ApplicationContext面向spring的使用者
无论用哪个,配置文件是相同的。

常用的ApplicationContext有CLassPathXmlApplicationContext从类路径中加载,FileSystemXmlApplicationContext从文件系统中加载,
spring入门笔记(二)IOC和DI

一些方法的使用

spring给我们提供了很多方法
spring入门笔记(二)IOC和DI
下面是一些使用案例

import org.junit.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Arrays;

public class SpringTest {
    @Test
    public void test(){
        //1.创建spring工厂
        ApplicationContext factory = new ClassPathXmlApplicationContext("applicationcontext.xml");
        //通过id获取bean对象
        Person p1 = (Person) factory.getBean("p1");
//        Person p1 = factory.getBean(Person.class); //唯一实例才可以,否则报错
        Person p2 =  (Person) factory.getBean("p2");
        System.out.println(p1);
        System.out.println(p2);
        //通过别名获取bean对象
        System.out.println(factory.getBean("zhang"));
        System.out.println(factory.getBean("li"));
        //通过id获取别名
        String[] names=factory.getAliases("p1");
        System.out.println(Arrays.toString(names));
        //通过别名获取id和其他别名
        System.out.println(Arrays.toString(factory.getAliases("zhang")));
        //根据id获取类型
        System.out.println(factory.getType("p1").getName());
        //判断包含
        System.out.println(factory.containsBean("p1"));
        System.out.println(factory.containsBean("p3"));
        //判断是否为单例
        System.out.println(factory.isSingleton("p1"));
        //检验单例
        p1.setAge(81);
        Person p3 = (Person)factory.getBean("p1");
        System.out.println(p3);

    }
}

其中相应的xml配置如下

<bean id="p1" name="zhang,san" class="Person">
        <property name="age" value="18"/>
        <property name="name" value="张三"></property>
    </bean>
    <bean id="p2" name="li" class="Person" scope="prototype">
        <property name="age" value="18"/>
        <property name="name" value="李四"></property>
    </bean>
相关标签: java 后端