1.基本概念
IoC(Inversion of Control),控制反转,通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
- IoC的作用:管理所有的Java对象(也称bean)及其相互间的依赖关系。
2.IoC的两种设计模式
- 反射:在运行状态中,根据提供的类的路径或类名,通过反射来动态获取该类 的所有属性和方法。
- 工厂模式 :把IoC容器当做一个工厂,在配置文件或注解中给出定义,然后利用反射技术,根据给出的类名生成相应的对象。对象生成的代码及对象之间的依赖关系在配置文件中定义,实现了解耦。
3.DI(依赖注入)的两种注入方式
- 构造器注入 (constructor-arg)
-
setter (property)
注意!!!: - 注入对象中没有setter方法的实现,则使用构造器注入的方式
- 对于强依赖,可使用构造器注入,弱依赖,推荐使用Setter注入
4.配置和使用
4.1配置方式
- xml方式
<bean id = "..." class="...">
<!-- 放置这个bean的协作者和配置 -->
</bean>
- 注解形式
@Configuration
public class AppConfig{
@Bean
public MyService myService(){
return new MyServiceImpl();
}
}
5.依赖注入的实例
- 消息服务接口用来打印消息和接口的实现类
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,并使用构造器注入-->
<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>
- 应用主类
public class MessageApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
MessagePrinter messagePrinter = context.getBean(MessagePrinter.class);
messagePrinter.printMessage();
}
}
-
运行结果
运行结果
网友评论