系列文章目录
IOC学习笔记Ⅱ
一、概念
IOC(Inversion of Control):使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。
DI(Dependency Injection)——IOC 的另一种表述方式:组件以一些预先定义好的方式 (例如: setter 方法)接受来自于容器的资源注入,在容器中建立bean与bean之间的依赖关系的整个过程。
二、IOC应用
1.bean的基本配置
基础配置:
①id 属性:bean 的名称,在 IOC 容器中,bean 的名称必须是唯一的。
②如果没有指定 id 属性,那么将会用 class 属性作为 bean 的名称。
③Class 属性:类的全名称(包名+类名)
<bean id="bookDao" class="org.example.dao.BookDaoImpl">
<property name="datebaseName" value="mysql"/>
<property name="connectionNum" value="100"/>
</bean>
从IOC容器获取Bean:
调用 ApplicationContext 的 getBean() 方法
getBean()方法的参数:
String:根据配置文件中的 ID 属性来获取 bean
Class:根据对象的类型来获取 bean
注意:如果只指定要返回的 Bean 的类型就想从 IOC 容器中取得 Bean 的前提是该类型的 Bean 在 IOC 容器中只有一个
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
获取bean
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
System.out.println(bookDao.getConnectionNum());
2.依赖注入
①通过属性注入(setter注入):
属性注入使用< property > 元素, 使用 name 属性指定 Bean 的属性名称,value 属性 或 < value > 子节点指定属性值。属性注入是实际应用中最常用的注入方式
<bean id="bookDao" class="org.example.dao.BookDaoImpl">
<property name="datebaseName" value="mysql"/>
<property name="connectionNum" value="100"/>
</bean>
②构造方法注入
public class BookDaoImpl implements BookDao{
private int connectionNum;
private String databaseName;
public BookDaoImpl(int connectionNum, String databaseName) {
this.connectionNum = connectionNum;
this.databaseName = databaseName;
}
@Override
public void save() {
System.out.println("book dao save ..." + databaseName + "," + connectionNum);
}
}
<bean id="bookDao" class="org.example.dao.BookDaoImpl">
<constructor-arg name="databaseName" value="mysql"/>
<constructor-arg name="connectionNum" value="666"/>
</bean>
选择:
1.强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
强制依赖指对象在创建的过程中必须要注入指定的参数
2…可选依赖使用setter注入进行,灵活性强
可选依赖指对象在创建过程中注入的参数可有可无
3.Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
4.如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
5.实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
6.自己开发的模块推荐使用setter注入
3.字面值
字面值:可用字符串表示的值,可以通过 元素标签或 value 属性进行注入。 基本数据类型及其封装类、String 等类型都可以采取字面值注入的方式 若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来。例:< mysql >
<bean id="bookDao" class="org.example.dao.BookDaoImpl">
<constructor-arg name="databaseName">
<value><![CDATA[<mysql>]]></value>
</constructor-arg>
<constructor-arg name="connectionNum" value="666"/>
</bean>
4.引用其他bean
组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 要使 Bean 能够相 互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用 在 Bean 的配置文件中, 可以通过 元素或 ref 属性为 Bean 的属性或构造器 参数指定对 Bean 的引用。
<bean id="bookService" class="org.example.service.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
<property name="userDao" ref="userDao"/>
</bean>
5.注入Null值
不能直接value=“null”
<property name="databaseName"> <null></null> </property>
6.注入级联属性
注意:Spring 为级联属性赋值之前必须先初始化对象,否则会出现异常。
<bean id="p2" class="edu.etime.springdemo.beans.Person">
<property name="name">
<null></null>
</property>
<!-- 通过属性来应用其他 bean -->
<property name="car">
<ref bean="car3" />
</property>
<!-- 注入级联属性 -->
<property name="car.price" value="40"></property> </bean>
注入级联属性后 IOC容器中car对象的price也会被随之改变
7.注入集合
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<!--数组注入-->
<property name="array">
<array>
<value>100</value>
<value>200</value>
<value>300</value>
</array>
</property>
<!--list集合注入-->
<property name="list">
<list>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
<value>chuanzhihui</value>
</list>
</property>
<!--set集合注入-->
<property name="set">
<set>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
<value>boxuegu</value>
</set>
</property>
<!--map集合注入-->
<property name="map">
<map>
<entry key="country" value="china"/>
<entry key="province" value="henan"/>
<entry key="city" value="kaifeng"/>
</map>
</property>
<!--Properties注入-->
<property name="properties">
<props>
<prop key="country">china</prop>
<prop key="province">henan</prop>
<prop key="city">kaifeng</prop>
</props>
</property>
</bean>
8.util&p标签
//引入命名空间
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
<util:list>
<ref bean="bookDao"/>
</util:list>
<bean id="bookDao" class="com.quickstart.dao.impl.BookDaoImpl"
p:databaseName="mysql" p:connectionNum="666">
</bean>
总结
对Spring进行了一个基础的入门,学习了IOC容器和DI依赖注入。