Spring学习(二)依赖注入(DI)
依赖注入(DI)背后的基本原理是对象之间的依赖关系(即一起工作的其它对象)只会通过以下几种方式来实现:构造器的参数、工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性。因此,容器的工作就是创建bean时注入那些依赖关系。相对于由bean自己来控制其实例化、直接在构造器中指定依赖关系或者类似服务定位器(Service Locator)模式这3种自主控制依赖关系注入的方法来说,控制从根本上发生了倒转,这也正是控制反转(Inversion of Control,IoC)名字的由来
注入方式一:使用构造器注入
- 使用xml方式注入
A.通过参数的顺序(顺序可以省略)
把person和student纳入spring容器中
[code]
<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>
[/code]
- 通过参数的类型
<constructor-arg type="java.lang.String">
<value>aaa</value>
</constructor-arg>
- 使用属性的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:书写比较麻烦,但是效率比较高
注解:书写比较简单,但是效率比较低。但是,注解的写法只适合引用
- 类扫描的注解解析器
<?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>