IOC的底层原理
Spring 提供了IOC容器实现的两个接口:
- BeanFactory:IOC容器的基本实现,主要是内部调用使用的。
用此接口时,在加载配置文件的时候,不会创建对象,只有在使用的时候才会创建对象 - ApplicationContext:是BeanFactory的子类。
用此接口时,在加载配置文件的时候就会创建对象
在开发的时候多用ApplicationContext。
IOC的Bean管理
基于xml方式
- 创建一个xml配置文件,每创建一个bean都要创建一个相对应的bean标签
其中
- id为唯一标识,与下面的getBean()方法里的形保持一致
- class为bean所在的全类名
- 创建对象的时候,默认是使用无参的构造器,所以当对应的实体类中没有无参构造器时会报错。
<bean id="user" class="com.study.spring5_1.bean.User">
</bean>
ApplicationContext app = new ClassPathXmlApplicationContext("bean1_user.xml");
User user = (User)app.getBean("user");
- 属性值的注入:
- 使用set方法注入
在xml里使用property标签。使用这个标签时对应的类的属性需要有set方法
<bean id="user" class="com.study.spring5_1.bean.User">
<property name="name" value="tom"></property>
</bean>
- 使用有参的构造器注入
需要先声明一个有参构造器。如果这里用了有参构造器,那么即使没有声明无参构造器也不会报错了
<bean id="user" class="com.study.spring5_1.bean.User">
<constructor-arg name="name" value="tom"></constructor-arg>
</bean>
- 使用p名称空间注入
先添加p名称空间,然后就能调用p:属性名,此种方式也得基于set方法
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="com.study.spring5_1.bean.User" p:name="tom">
</bean>
</beans>
<bean id="user" class="com.study.spring5_1.bean.User">
<property name="address">
<null></null>
</property>
</bean>
特殊符号 使用!CDATA方式可以实现,格式为<![CDATA[属性值]]>
<bean id="user" class="com.study.spring5_1.bean.User">
<property name="address">
<value><![CDATA[<><><><>]]></value>
</property>
</bean>
- 外部bean的注入
例子中UserService类有类型为UserDao的属性,因此在注入的时候使用ref,ref关联的是bean的id
<bean id="userService" class="com.study.spring5_1.service.UserService">
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="com.study.spring5_1.Dao.UserDaoImpl"></bean>
|