IOC 概述
IOC:Inverse of Control
,控制反转,指的是对象的创建权反转(交给)Spring框架,其作用是实现了程序的解耦合
IOC的实现原理
传统方式
面向接口编程,资源创建的权力由App决定,获取资源的时候需要new
一个新对象,在切换底层类的实现的时候,需要修改程序的源码
IOC控制反转
将控制权移交给Spring,通过工厂+反射+配置文件来实现解耦合
入门程序
创建 接口
public interface UserService {
public void sayHello();
}
编写接口 实现类
public class UserServiceImpl implements UserService {
public void sayHello(){
System.out.println("Demo01: Hello Spring ");
}
}
约束的配置文件
在applicationContest.xml
中使用bean
标签
<bean id="userService" class="wangfei910.Demo01.UserServiceImpl"/>
创建测试类
public class Demo01Test {
/**
* @Auther wangfei
*原来的方法
*/
@org.junit.Test
public void run1(){
//创建实现类
UserServiceImpl userService=new UserServiceImpl();
userService.sayHello();
}
/**
* @Auther wangfei
* Spring-IoC
*/
@org.junit.Test
public void run2(){
// 创建工厂,加载核心配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
// 从工厂中获得对象,与在XML bean 标签使用的 id 一致
UserServiceImpl userService=(UserServiceImpl) applicationContext.getBean("userService");
// 调用对象的方法执行
userService.sayHello();
}
}
Bean
标签
Bean
配置
id
属性:Bean标签的名字,在约束中唯一,取值要求:必须以字母开始,不能出现特殊字符name
属性:Bean标签的名字,没有采用ID的约束class
属性:Bean对象的全路径scope
属性:scope
属性代表Bean的作用范围singleton
:单例(默认)prototype
:多例request
:在Web项目中,每次HTTP请求都会创建一个新的Beansession
:在Web项目中,同一个HTTP Session共享一个Beanglobalsession
:在Web项目中,多服务器间的session
- Bean对象的创建和销毁两个属性配置
init-method
:当Bean被载入到容器的时候调用init-method
属性指定的方法destroy-method
:当Bean从容器中删除的时候调用destroy-method
属性指定的方法
Bean
之间的关系
-
继承
Spring允许定义一个父
<bean>
,子<bean>
将自动继承父<bean>
的配置信息
<bean id="car1" class="wangfei910.Demo.Car"
P:brand="红旗" p:price="2000" p:color="黑色"/>
<bean id="car2" class="wangfei910.Demo.Car"
P:brand="红旗" p:price="2000" p:color="红色"/>
<!-- 继承方式实现 -->
<!-- 定义为抽象bean -->
<bean id="abstratCar" class="wangfei910.Demo.Car"
p:brand="红旗" p:price="2000" p:color="黑色" abstract="true"/>
<!-- 继承 abstractCar -->
<bean id="car3" p:color="蓝色" parent="abstractCar"/>
<bean id="car3" p:brand="奔驰" parent="abstractCar"/>
- 依赖
Spring允许用户通过depends-on
属性显示指定Bean
前置依赖的Bean
,前置依赖的Bean
会在本Bean
实例化之前就创建好,例如:保证manager
在实例化之前,sysInit
就已经初始化完成
<bean id="manager" class="wangfei910.Demo.CacheManager" depends-on="sysInit"/>
<bena id="sysInit" class="wangfei910.Demo.SysInit"/>
- 引用
假如一个<bean>
要引用另一个<bean>
的id
属性值,则可以直接配置:
<bean id="car" class="wangfei910.Demo.Car"/>
<bean id="boss" class="wangfei910.Demo.Boss"
p:carId="car" scope="prototype"/>
一般情况下,在一个Bean
中引用另一个Bean
的id
是希望在运行期通过getBean(beanName)
方法获取对应的Bean
,但是由于Spring并不会在容器启动的时候对属性配置进行特殊的检查,因此即使拼写错误,也需要等到具体调用的时候才会发现。可以同过Spring的<idref>
元素标签来优化配置
<bean id="car" class="wangfei910.Demo.Car"/>
<bean id="boss" class="wangfei910.Demo.Boss">
<property name="carId">
<idref bean="car"/>
</property>
</bean>
下一篇:Spring学习笔记[2]之DI[依赖注入] https://blog.youkuaiyun.com/Rabbit_Judy/article/details/81842413