spring入门学习-2、IOC、DI知识

  • 什么是IOC

IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。传统的java开发,我们需要一个组件时,需要我们自己去new Object(),但是IOC思想是将创建对象的过程交给了容器,我们无需关心对象如何创建,只要在我们使用时直接去容器中取就可以。控制反转即:创建对象的权利反转了,传统的主动创建,现在变成了第三方创建我们来使用。

  • 什么是DI

DI—Dependency Injection,即“依赖注入”:将IOC容器中创建好的对象,注入到需要使用的地方。

  • DI和IOC的关系

“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。

  • DI依赖注入的几种方式
  1. xml配置文件注入

1)设值注入(setter注入)

①配置文件中设置<property>属性

<?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.xsd">
    <!--setter方法注入(设置植入)-->
    <bean id="mainTest" class="com.base.java.test.MainTest">
        <property name="demo" ref="test"></property>
    </bean>
    <bean id="test" class="com.base.java.test.TestDemo"></bean>
</beans>

 

②在类中创建setter方法

public class MainTest {
    private TestDemo demo;
    private String name;

    //setter方法注入
    public void setDemo(TestDemo demo) {
        this.demo = demo;
    }
    public void getTest(){
        System.out.println("注入成功" + name);
        demo.doSomeThing();
    }
}

 

说明:spring会使用类中的set方法对属性进行,setDemo与配置文件名称demo(去掉set)要相同否则会报错。

2)构造注入

①配置文件

<?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.xsd">
    <!--构造器注入-->
    <bean id="mainTest" class="com.base.java.test.MainTest">

<!--第一种方式-->

<constructor-arg index = "0" ref="test"></constructor-arg>
<constructor-arg index = "1" value="张三"></constructor-arg>

<!--第二种方式-->
        <constructor-arg name="demo" ref="test"></constructor-arg>
        <constructor-arg name = "name" value="张三"></constructor-arg>
    </bean>
    <bean id="test" class="com.base.java.test.TestDemo"></bean>
</beans>

 

②类中创建构造方法

package com.base.java.test;
/**
 * set注入和构造器注入
 */
public class MainTest {
    private TestDemo demo;
    private String name;
    //构造器方法注入
    public MainTest(TestDemo demo,String name){
        this.demo = demo;
        this.name = name;
    }
    public void getTest(){
        System.out.println("注入成功" + name);
        demo.doSomeThing();
    }
}

3)自动装配

说明:bean自动装配有四种方式:

  1. no:不做任何操作。
  2. byname:根据属性名称自动装配,要求属性名称与IOC容器内名称一致(需要set方法配合)。
  3. byType:根据属性type属性进行匹配(与配置文件id名称无关),如果存在多个该类型bean,抛出异常。如果找不到类型,什么事情都不做(需要set方法配合)。
  4. Constructor:与bytype类似,不同之处,他应用构造参数,如果没有找到与构造参数类型一致的bean,抛出异常(需要构造函数配合)。

配置文件

<?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.xsd"
default-autowire="byName">
    <bean id="test" class="com.base.java.test.MainTest"></bean>
    <bean id="demo" class="com.base.java.test.TestDemo"></bean>
</beans>

 

2.注解注入

1)@Autowired

这个注解是spring自带的注解,默认按类型进行注入,注入时如果类型有多个则报错,Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰

2)@Resource

@Resource是Java自己的注解,@Resource有两个属性是比较重要的,分是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值