Spring学习(二)依赖注入(DI)

By | 2014/08/25

Spring学习(二)依赖注入(DI)

依赖注入(DI)背后的基本原理是对象之间的依赖关系(即一起工作的其它对象)只会通过以下几种方式来实现:构造器的参数、工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性。因此,容器的工作就是创建bean时注入那些依赖关系。相对于由bean自己来控制其实例化、直接在构造器中指定依赖关系或者类似服务定位器(Service Locator模式这3种自主控制依赖关系注入的方法来说,控制从根本上发生了倒转,这也正是控制反转(Inversion of ControlIoC名字的由来

注入方式一:使用构造器注入

  1. 使用xml方式注入

A.通过参数的顺序(顺序可以省略)

把person和student纳入spring容器中


<bean id="person" class="cn.itcast.spring0401.di.constructor.Person">

<!-- 定义person中的构造器,用<constructor-arg></constructor-arg>来确定唯一的构造,

index 参数的索引值

ref 给引用类型赋值

value 给基本类型赋值 -->

<constructor-arg index="0" value="aaaa"></constructor-arg>

<constructor-arg index="1" value="sss"></constructor-arg>

<constructor-arg index="2" ref="student"></constructor-arg>

</bean>

<bean id="student" class="cn.itcast.spring0401.di.constructor.Student"></bean></beans>

  1. 通过参数的类型


<constructor-arg type="java.lang.String">

<value>aaa</value>

</constructor-arg>

  1. 使用属性的setting方法注入

<?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”>

<!–

把person和student纳入spring容器中

–>

<bean id=”person” class=”cn.itcast.spring0401.di.Person”>

<!–

property代表Person类的一个属性

name 为属性的名称

value 属性的值

String类型和基本类型(基本类型)是用value来进行赋值的

–>

<!–

<property name=”pid” value=”2″></property>

<property name=”pname” value=”里活命”></property>

<property name=”student”>

<!–

利用ref给对象赋值

–>

<ref bean=”student”/>

</property>

<property name=”lists”>

<list>

<value>

list1

</value>

<value>

list2

</value>

<ref bean=”student”/>

</list>

</property>

<property name=”sets”>

<set>

<value>

set1

</value>

<value>

set2

</value>

<ref bean=”student”/>

</set>

</property>

<property name=”maps”>

<map>

<entry key=”entry1″>

<value>

aaa

</value>

</entry>

<entry key=”entry2″>

<value>

bbb

</value>

</entry>

<entry key=”entry3″>

<ref bean=”student”/>

</entry>

</map>

</property>

<property name=”properties”>

<props>

<prop key=”prop1″>

prop1

</prop>

<prop key=”prop2″>

prop2

</prop>

</props>

</property>

<!–

定义person中的构造器

用<constructor-arg></constructor-arg>来确定唯一的构造器

index

参数的索引值

ref

给引用类型赋值

value

给基本类型赋值

–>

<constructor-arg value=”aaaa”></constructor-arg>

<constructor-arg ref=”student”></constructor-arg>

</bean>

<bean id=”student” class=”cn.itcast.spring0401.di.Student”></bean>

</beans>

 

依赖注入的注解形式

在配置文件中进行配置

<?xml version=”1.0″ encoding=”UTF-8″?>

<beans xmlns=”http://www.springframework.org/schema/beans”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xmlns:context=”http://www.springframework.org/schema/context”

xsi:schemaLocation=”http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-2.5.xsd”>

<!–

1、导入基于注解的xsd

xmlns:context=”http://www.springframework.org/schema/context”

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-2.5.xsd

2、导入注解解析器

<context:annotation-config></context:annotation-config>

3、导入person和student

–>

<!–

–>

<context:annotation-config></context:annotation-config>

<bean id=”person” class=”cn.ytu.spring.di.annotation.Person”></bean>

<bean id=”student” class=”cn. ytu.spring.di.annotation.Student”></bean>

</beans>

注解的工作原理:

当spring容器启动的时候,

ApplicationContext context = new ClassPathXmlApplicationContext(“。。。。”);

spring容器会创建纳入spring容器管理的bean.分别为person和student;

spring容器会解析配置文件,会解析到<context:annotation-config>

</context:annotation-config>,会在纳入spring的bean范围内查找属性上是否存在

@Resource(name=”student”)

* 如果存在:

* 继续解析@Resource有没有name属性

* 如果没有name属性就会在所属的属性上,把属性的名称解析出来。会让属性的名称和spring中的bean中的id 进行匹配,

如果匹配成功,则把spring容器中相应的对象赋值给该属性

如果匹配不成功,则按照类型进行匹配

* @Resource有name属性就会解析name属性的值,把这个值和sprin中的bean的id进行匹配

* 如果匹配成功,则把spring容器中的相应的对象赋值给该属性

* 如果匹配不成功,则直接报错

* 如果不存在:不做任何事情

xml和注解的写法:

xml:书写比较麻烦,但是效率比较高

注解:书写比较简单,但是效率比较低。但是,注解的写法只适合引用

 

  1. 类扫描的注解解析器

<?xml version=”1.0″ encoding=”UTF-8″?>

<beans xmlns=”http://www.springframework.org/schema/beans”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xmlns:context=”http://www.springframework.org/schema/context”

xsi:schemaLocation=”http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-2.5.xsd”>

<!– 1、导入基于注解的xsd

xmlns:context=”http://www.springframework.org/schema/context”

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-2.5.xsd

2、导入类扫描的注解解析器

<context:component-scan base-package=””></context:component-scan>

–>

<!–

原理:

* 类扫描的注解解析器包含了依赖注入的注解解析器

* 原理:

当启动spring容器的时候,

ApplicationContext context = new ClassPathXmlApplicationContext(“。。。。”);

spring容器会加载配置文件,并且解析配置文件,就会解析到

* 类扫描的注解解析器,会在base-package包及子包中扫描所有的类

* 检查类上是否有@Compontent注解

* 如果有,则继续检查@Compontent是否有value属性

* 如果没有value属性则会把这个注解所在的类的类名的第一个字母变成小写,其余的不变当做bean的id

* 如果有value属性则value属性的值就是bean的id

* 如果没有类扫描注解解析完以后,所有的在base-package包及子包下的带有@Compontent注解的类就被纳入spring管理了在纳入spring管理的类中扫描各个属性,看属性是否有@Resource,再根据这个注解的规则进行操作。

扫描的次数:

根据base-package包及子包进行扫描

扫描纳入spring管理的所有的bean的属性

属性的name的值和bean中的id进行匹配

–>

<context:component-scan base-package=”cn.itcast.spring0401.scan”></context:component-scan>

</beans>

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.