五分钟学会Spring的IOC与DI

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jingyangV587/article/details/80380658

前言:如果要快速理解仅需看贴上去的两个代码示例别的不用看,如果要继续扩充知识看下知识扩充。每个扩充都有源码!每个扩充都有源码!!每个扩充都有源码!!!

spring的IOC

IOC简单讲解

 Ioc—Inversion of Control,即“控制反转”。通常程序员创建一个对象需要自己手动去new一个,既控制正转。现在交给spring的ioc容器去管理,让他帮你去new,既控制反转。

IOC快速入门案例

实体类

package com.test;
public class HelloWorld {
    public void hello(){
        System.out.println("hello world");
    }
}

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/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="helloWorld" class="com.test.HelloWorld"></bean>
</beans>

测试类

package com.test;

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

public class HelloWorldTest {
    @Test
    public void testHelloWorld(){
        //启动spring容器
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //根据id把spring容器中的bean提取出来了
        HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
        helloWorld.hello();
    }
}

运行结果

这里写图片描述

例子简介

从例子中可以感受到,我们不需要自己去new一个HelloWorld对象,而是通过ClassPathXmlApplicationContext这个对象从spring容器中获取HelloWorld对象,这就是IOC的控制反转。

IOC知识扩充

IOC创建对象的方式

(1)默认构造函数创建,既上面那个例子
(2)实例工厂方法
(3)静态工厂方法

IOC创建对象的时间

(1)默认启动spring容器的时候创建
(2)当设置lazy-init=”true”的时候,调用的时候创建

IOC创建对象的范围

(1)默认状态下为单例,既创建对象这个类的属性是全局的
(2)设置scope=”prototype”的时候,是多例的,而且 无论lazy-init是值,都是在获取bean的时候才创建对象

IOC创建对象时的初始化与销毁方法

(1)初始化方法init-method,加载spring容器的时候调用初始化方法,进行初始化。
(2)销毁方法destroy-method,spring容器关闭的时候进行调用销毁方法,进行销毁。

对象的别名alias

(1)通过使用alias=”xxx”可将一个bean起多个别名

spring的DI

DI简单讲解

DI—Dependency Injection,即“依赖注入”。依赖:应用程序依赖spring的IOC容器,注入:IOC容器注入某对象赋值。简单的可以理解为,给类的属性赋值。有了spring的IOC容器,我们不用自己在程序中手动去赋值,可以交给spring的IOC容器去赋值,这样我们无须知道怎么赋值,赋的什么值,可以将注意力集中在业务逻辑中。

DI快速入门案例

实体类

package com.test;
public class Person {
    private Long pid;
    private String name;
   /*get set省略*/
}

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/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
   <bean id="person" class="com.test.Person">
        <property name="pid" value="1"></property>
        <property name="name" value="狗蛋"></property>
   </bean>
</beans>

测试类

package com.test;

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

public class DTXMLTest {
    @Test
    public void testDI_XML_Setter(){
        ApplicationContext context = 
                new ClassPathXmlApplicationContext("applicationContext.xml");

        Person person = (Person)context.getBean("person");
        System.out.println(person.getName());
        System.out.println(person.getPid());
    }
}

运行结果

这里写图片描述

例子简介

从例子中可以看出,我们在应用程序中并没有对属性赋值,直接就能得到类的值。应为spring容器在加载的时候已经对类的属性进行了赋值,类的属性可以是类,可以是集合,数组等。这就是依赖注入,也就是给属性赋值。

DI知识扩充

依赖注入的方式

(1)通过set方法注入,既上面的小例子。
(2)通过构造器注入。
(3)父类与子类之间的赋值。

进一步补充(可忽略)

spring的IOC与DI注解形式

(1)di的注解形式。
(2)IOC与DI的注解形式。
(1)(2)的例子可能让您对annotation-config 与
component-scan区别产生疑问,如有疑问参考博客:https://blog.csdn.net/jingyangV587/article/details/80384819
(3)IOC与DI简单的mvc(加深理解)。

项目源码:https://gitee.com/jingyang3877/spring-test
参考博客:https://blog.csdn.net/qq_22654611/article/details/52606960/

猜你喜欢

转载自blog.csdn.net/jingyangV587/article/details/80380658
今日推荐