Spring——IOC&DI浅析

一、概述

Spring的核心技术就是IOC和AOP,分别是控制反转和面向切面编程。
IOC(Inversion of Control)控制反转(反转资源获取方向),顾名思义就是
将获取资源的方式转换方向,传统的资源获取需要组件向容器发起请求查找资源。作为回应,容器适时的返回资源。而应用了IOC之后,则是容器主动的将资源推送给它所管理的组件,组件要做的仅是选择一种合适的方式来接收资源,这种方式也被称为被动的查找形式。
DI(Dependency Injection)依赖注入,也就是IOC的另一种表达方式:即组件以一些预先定义好的方式来接收来自容器的资源注入,相对IOC而言表达形式更加直接了当。
Spring框架,作用是由IOC容器来管理Bean,并且为我们的程序提供bean的实例。

二、Bean的配置

1. 基本配置

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
       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
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	<bean id="user" class="edu.spring.ioc.beans.User">
		<property name="name" value="张三"></property>
	</bean>
</beans>

说明:

  • id属性:bean的名称,在ioc容器中,bean的名称是唯一的。
  • 如果没有指定id属性,则会把class属性作为bean的名称。
  • class属性:类的全限定名(包名+类名)

2. 获取bean

首先通过ClassPathXmlApplicationContext加载XML配置文件创建bean实例工厂,然后通过ClassPathXmlApplicationContext实例的getBean方法获取实例bean。

ClassPathXmlApplicationContext context = 
		new ClassPathXmlApplicationContext("Application.xml");
User user = (User)context.getBean("user");
System.out.println(user.getName());

getBean方法的参数则是在配置bean时的id属性值。

  • getBean()参数可以传入配置bean时的id
  • getBean()参数可以传入需要获取的bean的类型的class对象
ClassPathXmlApplicationContext context = 
		new ClassPathXmlApplicationContext("Application.xml");
User user = context.getBean(User.class);
System.out.println(user.getName());

注:如果xml中配置了两个相同类型的bean时,使用这种方法则会抛异常
org.springframework.beans.factory.NoUniqueBeanDefinitionException:

三、依赖注入

1. 概述

所谓的依赖注入就是通过配置文件,构造方法等方式向bean的属性中注入值。在spring中依赖注入有三种方式:属性注入、构造方法注入、通过工厂方法注入。

1.1 属性注入

属性注入又称setter方法注入bean的属性值或依赖对象。
属性注入使用 < property >元素,使用name属性指定bean的属性名称,value属性或< value> 子节点指定bean的属性值。属性注入是实际应用中对常用的注入方式。

<bean id="user" class="edu.spring.ioc.beans.User">
    <property name="name" value="张三"></property>
</bean>

向user这个bean的name属性注入值“张三”

1.2 构造方法注入

定义类

public class Address {
    private String province;
    private String city;
    private String area;

    public Address(String province, String city, String area) {
        this.province = province;
        this.city = city;
        this.area = area;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }
}

配置bean

<bean id="address" class="edu.spring.ioc.beans.Address">
	   <constructor-arg index="0" value="四川省"/>
	   <constructor-arg index="1" value="成都市"/>
	   <constructor-arg index="2" value="锦江区"/>
</bean>

注:在配置文件中的 constructor-arg 节点的顺序要和构造方法中参数的顺序一致(设置的参数个数与构造方法中的参数数量一致)
index属性表示构造方法中的参数顺序。

1.3 字面值

字面值:可用字符串表示的值,可以< value>标签或value属性进行注入。
基本数据类型及其封装类、String等类型都可以采用字面值注入的方式,若字面值中包含特殊字符,可以使用< ![CDATA[]]>把字面值包起来。

<bean id="address" class="edu.spring.ioc.beans.Address">
   <constructor-arg index="0" value="四川省"/>
   <constructor-arg index="1" value="成都市"/>
   <constructor-arg index="2">
       <value><![CDATA[<锦江区>]]></value>
   </constructor-arg>
</bean>

1.4 引用其它bean(ref)

组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 要使 Bean 能够相 互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用。
在bean的配置文件中,可以通过< ref>元素或ref属性为bean的属性或构造器参数指定引用的bean。

<bean id="address" class="edu.spring.ioc.beans.Address">
    <constructor-arg index="0" value="四川省"/>
    <constructor-arg index="1" value="成都市"/>
    <constructor-arg index="2">
        <value><![CDATA[<锦江区>]]></value>
    </constructor-arg>
</bean>
<bean id="user" class="edu.spring.ioc.beans.User">
    <property name="name" value="张三"></property>
    <!-- <property name="address" ref="address"></property> -->
    <!-- 或者 -->
    <property name="address">
        <ref bean="address"></ref>
    </property>
</bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值