IOC
概述:spring的核心之一
控制反转:就是将bean的创建权交给spring容器管理.解决高耦合性问题
底层:配置文件+反射+工厂模式
入门案例:
步骤:
1.下载spring
去官网下就可以了 https://spring.io/
2.新建一个项目
导入jar:核心jar包
spring解压目录下:core,beans,context,expression
spring日志(spring的依赖包):
org.apache.log4j
org.apache.commons.logging
3.编写配置文件
名称:自定义 建议:applicationContext.xml
位置:自定义 建议:放在src下
导入约束:去文件中spring-framework-4.2.4.RELEASE/docs/spring-framework-reference/html/xsd-configuration.html中找
<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.xsd">
</beans>
4.编写接口和类 UserDao和UserDaoImpl
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("userDao中的save方法执行了!!");
}
}
5.在配置文件配置bean
<!--
配置bean:
id:就是给bean起个名字,项目中唯一
class:具体类的全限定名
-->
<bean id="userDao" class="com.xx.a_hello.UserDaoImpl"></bean>
6.测试代码
//获取工厂类
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean
UserDao userDao = (UserDao) context.getBean("userDao");
api:bean工厂类
BeanFactory:接口
★ApplicationContext:接口 是BeanFactory的子接口
主要区别:
子接口具有更多的方法
bean的初始化时机不同.
BeanFactory中的bean是在调用getBean方法的时候完成初始化
ApplicationContext中的bean一般是在工厂类初始化的时候完成初始化(多例的不是)
ApplicationContext接口的实现类
ClassPathXmlApplicationContext:从类路径下加载配置文件
FileSystemXmlApplicationContext:从磁盘路径下加载配置文件
spring容器认为是一个map:key是bean的id value是:bean对象
配置文件提示
配置文件中的bean标签配置:
bean的属性
id:就是给bean起个名字,项目中唯一,不能出现特殊符号
class:具体类的全限定名
scope:声明bean的作用范围
常用值:
singleton:单例 默认值
prototype:多例 (action是多实例的)
了解的属性:
init-method:spring容器初始化bean的时候要调用的方法
destroy-method:spring容器销毁bean的时候要调用的方法(只能bean是单例的时候才可以调用)
bean的实例化方式
方式1:无参构造器方式
<bean id="" class=""/>
(了解)方式2:静态工厂实例化
需要创建一个产生指定bean工厂类
在类中提供一个静态获取bean的方法
在配置文件中配置工厂和方法即可
<bean id="" class="工厂的全限定名" factory-method="静态方法的名称">
<!-- 静态工厂实例化 -->
<bean id="user2" class="com.itheima.c_instance.User2Factory" factory-method="createUser2"></bean>
(了解)方式3:实例工厂实例化
需要创建一个产生指定bean工厂类
在类中提供一个方法获取bean的方法
先配置工厂类(先实例化工厂)
在配置需要的bean对象(再实例化bean对象)
<!-- 配置工厂类 -->
<bean id="user3factory" class="com.itheima.c_instance.User3Factory"></bean>
<!-- 配置bean对象 -->
<bean id="user3" factory-bean="user3factory" factory-method="createUser3"></bean>
DI:依赖注入
ioc的一个核心,在spring创建bean对象的时候,将bean的属性给设置进去.
依赖注入方式:★
方式1:构造器注入(理解)
通过bean标签的construct-arg子标签注入
constructor-arg:
name属性:构造器参数的名称
value属性:设置参数值(类型为基本类型和String类型)
ref属性:设置参数值(bean类型)
例如:
<!-- 注入方式1:构造器注入
constructor-arg:
name属性:构造器参数的名称
value属性:设置参数值(类型为基本类型和String类型)
ref属性:设置参数值(bean类型)
-->
<bean id="bus1" class="com.itheima.e_di.Bus1">
<constructor-arg name="brand" value="byd"/>
<constructor-arg name="price" value="5000000"/>
</bean>
方式2:属性注入★★
前提:bean中需要有属性(set和get方法)
通过bean标签的property标签:
name属性:构造器参数的名称
value属性:设置参数值(类型为基本类型和String类型)
ref属性:设置参数值(bean类型)子标签注入
<!-- 方式2:属性注入
property标签:
name属性:构造器参数的名称
value属性:设置参数值(类型为基本类型和String类型)
ref属性:设置参数值(bean类型) bean的id或者name属性值
-->
<bean id="bus2" class="com.xx.e_di.Bus2">
<property name="brand" value="金龙"/>
<property name="price" value="700000"></property>
</bean>
<bean id="person" class="com.xx.e_di.Person">
<property name="name" value="小青"/>
<property name="bus" ref="bus2"></property>
</bean>
方式3:p名称空间注入(有可能见到,底层也是属性注入)
在约束文件导入p名称空间
xmlns:p=”http://www.springframework.org/schema/p”
注入属性的时候直接通过bean标签就可以完成
<bean id="" class="" p:属性名="值" p:属性名2-ref="值"/>
<!-- 方式3:p名称空间方式注入 -->
<bean id="person" class="com.itheima.e_di.Person" p:name="小花" p:bus-ref="bus2"></bean>
方式4:复杂类型注入
list和数组 使用list标签
<list>
<value>ss</value>
</list>
map 使用map标签
<map>
<entry key="" value=""/>
</map>
properties 使用props标签
<props>
<prop key="">...</prop>
</props>
例如:
<bean id="collectionBean" class="com.itheima.e_di.CollectionBean">
<!-- 注入数组 -->
<property name="ss">
<list>
<value>aa</value>
<value>bb</value>
<value>cc</value>
</list>
</property>
<!-- 注入list -->
<property name="ll">
<list>
<value>11</value>
<value>22</value>
<value>33</value>
</list>
</property>
<!-- 注入map -->
<property name="mm">
<map>
<!--
key:键名 基本类型或string
value:值 基本类型或string
key-ref:键名 bean类型
value-ref:值 bean类型
-->
<entry key="aa" value="11"></entry>
<entry key="bb" value="22"></entry>
<entry key="cc" value-ref="bus2"></entry>
</map>
</property>
<!-- 注入properties -->
<property name="pp">
<props>
<prop key="username">root</prop>
<prop key="password">1234</prop>
</props>
</property>
</bean>
导入其他的spring配置文件★★
<import resource="applicationContext2.xml"/>