1.基本概念
IoC(Inversion of Control),控制反轉(zhuǎn),通過(guò)控制反轉(zhuǎn)峡捡,對(duì)象在被創(chuàng)建的時(shí)候,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體客燕,將其所依賴的對(duì)象的引用傳遞給它慨亲。也可以說(shuō)婚瓜,依賴被注入到對(duì)象中。
- IoC的作用:管理所有的Java對(duì)象(也稱bean)及其相互間的依賴關(guān)系刑棵。
2.IoC的兩種設(shè)計(jì)模式
- 反射:在運(yùn)行狀態(tài)中巴刻,根據(jù)提供的類的路徑或類名,通過(guò)反射來(lái)動(dòng)態(tài)獲取該類 的所有屬性和方法蛉签。
- 工廠模式 :把IoC容器當(dāng)做一個(gè)工廠胡陪,在配置文件或注解中給出定義,然后利用反射技術(shù)正蛙,根據(jù)給出的類名生成相應(yīng)的對(duì)象督弓。對(duì)象生成的代碼及對(duì)象之間的依賴關(guān)系在配置文件中定義,實(shí)現(xiàn)了解耦乒验。
3.DI(依賴注入)的兩種注入方式
- 構(gòu)造器注入 (constructor-arg)
-
setter (property)
注意!!!: - 注入對(duì)象中沒(méi)有setter方法的實(shí)現(xiàn)愚隧,則使用構(gòu)造器注入的方式
- 對(duì)于強(qiáng)依賴,可使用構(gòu)造器注入锻全,弱依賴狂塘,推薦使用Setter注入
4.配置和使用
4.1配置方式
- xml方式
<bean id = "..." class="...">
<!-- 放置這個(gè)bean的協(xié)作者和配置 -->
</bean>
- 注解形式
@Configuration
public class AppConfig{
@Bean
public MyService myService(){
return new MyServiceImpl();
}
}
5.依賴注入的實(shí)例
- 消息服務(wù)接口用來(lái)打印消息和接口的實(shí)現(xiàn)類
public interface MessageService {
String getMessage();
}
public class MessageServiceImpl implements MessageService {
private String username;
private int age;
public MessageServiceImpl(String username, int age) {
this.username = username;
this.age = age;
}
@Override
public String getMessage() {
return "Hello World!" + "\nusername is " + username + ",age is " + age;
}
}
- 打印器類
public class MessagePrinter {
final private MessageService messageService;
public MessagePrinter(MessageService messageService) {
this.messageService = messageService;
}
public void printMessage() {
System.out.println(this.messageService.getMessage());
}
}
- 配置文件
<!--定義bean,并使用構(gòu)造器注入-->
<bean id="messageServiceImpl" class="com.spring.quickstart.MessageServiceImpl">
<constructor-arg name="username" value="Lily"/>
<constructor-arg name="age" value="20"/>
</bean>
<bean id="messagePrinter" class="com.spring.quickstart.MessagePrinter">
<constructor-arg name="messageService" ref="messageServiceImpl"/>
</bean>
- 應(yīng)用主類
public class MessageApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
MessagePrinter messagePrinter = context.getBean(MessagePrinter.class);
messagePrinter.printMessage();
}
}
-
運(yùn)行結(jié)果