1、 IOC 基础
Ioc(Inversion of control),即控制反转,它不是一种技术,而是一种编程思想:将对象的控制权交由容器控制,也就是所谓的“反转”,而不是传统的在对象里面通过new创建进而来控制依赖对象,能指导我们设计出松耦合,更高质量的程序。
Ioc容器:具有依赖注入的功能的容器,Ioc容器负责实例化、定位、配置应用程序中的对象及建立这些对象之间的依赖。应用程序无需直接在代码中new对象,全部由Ioc容器进行组装。在Spring中BeanFactory是Ioc容器的管理者。
2、 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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
"
>
<bean id="hello" class="Test201309.HelloWorldImpl">
</bean>
</beans>
a、<bean>标签主要用来进行bean定义;
b、alias用于定义bean的别名;
c、import用于导入其他的配置文件中的bean,这是为了加载多个配置文件。
d、每个bean可以有一个或者多个id,我们把第一个id成为“标示符”,其余id
叫做“别名”;这些id在Ioc容器中必须唯一。
3、 实例化Bean
传统应用程序可以通过new和反射方式进行实例化bean,而spring Ioc容器则需要根据
Bean定义里的配置元素使用反射机制来创建Bean。在spring Ioc容器创建bean有一下几种方式:
①、 使用构造器实例化bean:
<bean id="hello" class="Test201309.HelloWorldImpl">
<constructor-arg index="0" value="Hello Spring!">
</constructor-arg>
</bean>
②、 使用静态工厂方式实例化bean,使用这种方式除了制定必须的class属性,还要指定factory-method属性来指定实例化bean方法,而且使用静态工厂方法允许指定方法参数,spring Ioc将调用指定的方法实例化bean:
<!-- 使用静态工厂方法实例化bean -->
<bean id="MyStaticFactory" class="Test201309.MyStaticBeanFactory" factory-method="create">
<constructor-arg index="0" value="hello Spring--2!"/>
</bean>
③、 使用实例工厂实例化bean,这种方式不能指定class属性,需要指定factory-bean属性,和factory-method属性,分别用于指明工厂bean和实例化bean的方法:
<!-- 工厂类 -->
<bean id="MyBeanFactory" class="Test201309.MyBeanFactory"></bean>
<!-- 使用实例化工厂来创建bean -->
<bean id="MyBeanFactoryInstance" factory-bean="MyBeanFactory" factory-method="create">
<constructor-arg index="0" value="hello Spring--3!"/>
</bean>
4、 类与类之间的关系:
传统应用程序所说的依赖即为类与类之间的关系:
泛化:表示类与类之间、接口与接口的继承关系;
实现:表示类对接口的实现;
依赖:当类与类之间有使用关系时,就属于依赖关系;依赖不同于关联关系,依赖不具有“拥有关系”,而是一种“相识关系”,只在一个特定的地方(比如方法内部)才有关系;
关联:表示为类与类、类与接口之间的依赖关系,表现为拥有关系;具体到可以实例化变量来表示;
聚合:属于关联关系的特殊情况,体现部分和整体的关系,是一种弱拥有的关系,整体和部分可以有不同的生命周期;是一种弱关联;
组合:属于关联关系的特殊情况,体现部分和整体的关系,是一种强拥有的关系,整体和部分有相同的生命周期;是一种强关联;
5、 构造器的注入
①、 根据参数索引注入:index表示索引,从0开始,value表示值
<constructor-arg index="0" value="hello Spring--2!"/>
②、 根据参数类型注入:除基本数据类型外,需用全路径名:如java.lang.String
<constructor-art type="java.lang.String" value="hello Spring--String"/>
③、根据参数名注入:
<constructor-arg name="message" value="hello Spring--String"/>
6、 setter注入:是指通过构造器、静态工厂或者实力工厂实例好bean后,调用Bean类的setter方法进行注入;
<bean id="person" class="Test201309.Person">
<property name="name" value="aobo"/>
<property name="age" value="18"/>
<property name="rmb"><value>so</value></property>
</bean>
Setter方法要遵循”javaBean getter/setter 方法命名约定”。
JavaBean:本质就是一个POJO类,该类必须要有公共的无参构造器;属性为private访问级别,不建议public;属性必要时通过一组setter(设置)和getter(取值)方法来访问。
7、 注入bean id:
用于注入Bean的ID,ID是一个常量而不是引用,类似于注入常量,但提供错误验证的功能,及验证该bean是否存在。
<bean id="StringBean1" class="java.lang.String">
<constructor-arg index="0" value="test 1"/>
</bean>
<bean id="StringBean2" class="java.lang.String">
<constructor-arg index="0" value="test 2"/>
</bean>
<bean id="refIdBean1" class="Test201309.RefIdBeanTest">
<property name="id"><idref bean="StringBean1"></idref></property>
</bean>
<bean id="refIdBean2" class="Test201309.RefIdBeanTest">
<property name="id"><idref local="StringBean2"></idref></property>
</bean>
8、 注入集合类型:包括Collection类型、Set类型、List类型
(1)List 类型:需要使用<list>标签来配置注入
可选属性:value-type:表示数据的类型
<!-- list 类型注入 -->
<bean id="listTest" class="Test201309.ListTest">
<property name="list">
<list value-type="java.lang.String">
<value>This</value>
<value>is</value>
<value>comment</value>
</list>
</property>
</bean>
(2)Set类型:需要使用<set>标签来配置注入,配置参数同List类型。
<!-- Set 类型注入 -->
<bean id="setTest" class="Test201309.SetTest">
<property name="values">
<set>
<value>A</value>
<value>B</value>
<value>C</value>
</set>
</property>
</bean>
(3)Collection类型是Set和List的父类,可以使用<set>和<list>来注入。
9、数组类型注入:
需要使用<array>标签类配置注入,其中属性:“value-type”和<list>标签含义一样,
也可以用<list>标签配置注入;如果是多维数组,则嵌套即可。
<!-- Array 类型注入 -->
<bean id="arrayTest1" class="Test201309.ArrayTest">
<property name="array">
<array value-type="int">
<value>1</value>
<value>2</value>
<value>3</value>
</array>
</property>
</bean>
<!-- Array 类型注入 -->
<bean id="arrayTest2" class="Test201309.ArrayTest">
<property name="array">
<list>
<value>4</value>
<value>5</value>
<value>6</value>
</list>
</property>
</bean>
9、 注入Map类型:使用<map>来配置注入,其属性“key-type”和“value-type”分别制定“键”和“值”的类型;
<!-- Map 类型注入 -->
<bean id="mapTest" class="Test201309.MapTest">
<property name="map">
<map key-type="java.lang.String" value-type="java.lang.String">
<entry>
<key><value>1</value></key>
<value>1</value>
</entry>
...
<entry key="3" value="3"/>
</map>
</property>
</bean>
10、 Properties注入:注入java.util.Properties类型数据,需要使用<props>标签配置注入,键和值必须是String类型,子标签通过<prop key=”键”>值</prop>来指定;可以直接用<value>以键值对的形式:键 = 值 来指定;
<!-- properties类型注入 -->
<bean id="propTest" class="Test201309.PropTest">
<property name="prop">
<props>
<prop key="1">1</prop>
<prop key="2">2</prop>
<prop key="3">3</prop>
</props>
</property>
</bean>
<!-- properties类型注入 -->
<bean id="propTest2" class="Test201309.PropTest">
<property name="prop">
<value>
zh_n = china
en = english
us = america
</value>
</property>
</bean>
11、 注入bean
<bean id="person" class="Test201309.Person">
<property name="name" value="aobo"/>
<property name="age" value="18"/>
<property name="rmb"><value>so</value></property>
</bean>
<!-- 注入bean id -->
<bean id="StringBean1" class="java.lang.String">
<constructor-arg index="0" value="test 1"/>
</bean>
<!-- 注入bean -->
<bean id="whitePerson" class="Test201309.WhitePerson">
<property name="person" ref="person"></property>
<property name="message"><ref bean="StringBean1"/></property>
</bean>
<ref local=””/> 、<ref bean=””/>和<ref parent=””/>的区别:
①、<ref local=””/>:用于引用通过<bean id=””>方式中通过id属性指定的Bean,它能利用xml解析器的验证功能在读取同一个配置文件时来验证引用的Bean是否存在。所以如果引用的bean在同一个xml配置文件中,那么用local是最好的选择。
②、<ref bean>:是寻找所有xml配置文件中,当前的BeanFactory或ApplicationContext中的bean,bean属性的值可以和依赖的的Bean的id属性相同,也可以和name属性相同。
③、<ref parent>:允许引用当前BeanFactory或ApplicationContext的父BeanFactory或ApplicationContext中的Bean,同时bean属性的值可以和依赖的Bean的id属性相同,也可以和name属性相同。简单的说,就是,引用父容器的Bean,不会引用当前容器中的Bean,当然父容器的Bean和当前的Bean是可以重名的,获取顺序是直接到父容器栈。
内部bean的注入:内部Bean就是在<property>或<constructor-arg>内通过<bean>标签定义的Bean,该Bean不管是否指定id或name,该bean都会有唯一的匿名标示符,而且不能指定别名,该内部bean对其他外部bean是不可见的。
<!-- 注入内部bean -->
<bean id="whitePerson2" class="Test201309.WhitePerson">
<property name="person" >
<bean id="person1" class="Test201309.Person">
<property name="name" value="aobo"/>
<property name="age" value="19"/>
<property name="rmb"><value>so</value></property>
</bean>
</property>
<property name="message"><ref bean="StringBean1"/></property>
</bean>
12、注入null值
Spring中通过<null/>标签注入null值。
<!-- null 注入 -->
<bean id="person2" class="Test201309.Person">
<property name="name" value="aobo"/>
<property name="age" value="19"/>
<property name="rmb"><null/></property>
</bean>