控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
1.IoC是一个很大的概念,可以用不同的方式实现。其主要形式有两种:
-
依赖查找:容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码获得相关资源。
-
依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection)
2.IOC和bean
Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务。
- 通过构造器或工厂方法创建Bean实例
- 为Bean的属性设置值和对其它Bean的引用
- 调用Bean的初始化方法
- 当容器关闭时,调用Bean的销毁方法
Spring IoC容器的核心基础包:
- org.springframework.beans
- org.springframework.context
3. 配置和使用
配置方式有:
- xml形式
<bean id = "..." class="...">
<!-- 放置bean的协作者和配置 -->
</bean>
- 注解形式
@Configuration
public class AppCar{
@Bean
public MyService myService(){
return new MyServiceImpl();
}
}
4.注解方式
- 构造器注入
- setter注入
示例
MassageService
public interface MassageService {
String getMassage();
}
MassageServiceImpl
public class MassageServiceImpl implements MassageService {
private String username;
private int age;
public MassageServiceImpl(String username,int age){
this.username=username;
this.age=age;
}
public String getMassage(){
return "HelloWord!"+username+",age is"+age;
}
}
MassagePrinter
public class MassagePrinter {
final private MassageService service;
public MassagePrinter(MassageService service){
this.service=service;
}
public void printMassage(){
System.out.println(this.service.getMassage());
}
}
配置文件
<bean id="messageServiceImpl" class="com.spring.quickstart.MessageServiceImpl">
<constructor-arg name="username" value="Tom"/>
<constructor-arg name="age" value="20"/>
</bean>
<bean id="messagePrinter" class="com.spring.quickstart.MessagePrinter">
<constructor-arg name="messageService" ref="messageServiceImpl"/>
</bean>
MassageApp
public class MessageApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("/application.xml");
MessagePrinter messagePrinter = context.getBean(MessagePrinter.class);
messagePrinter.printMessage();
}
}
5.依赖注入详细配置
- 直接赋值
- 引用其他bean
- 内部bean
- 集合
- Null及空字符的值
- xml短域名空间
- 复合属性名称
网友评论