IOC 容器
IOC 容器
IOC 全称是 Inversion of Control 即 控制反转,DI 全称是 Dependency Injection 即 依赖注入
IOC 是一种设计原则,DI 是 IOC 的实现,两者相辅相成,所以都说 Spring 是两大特性 IOC/DI 和 AOP
如果不使用 IOC,每次使用对象都要通过 new 来创建对象,然后给属性赋值,最后再使用。如果使用 IOC,通过 Spring 配置在程序启动的时候就把所有的对象创建好了,保存在 IOC 容器中,必要的属性也赋值好了,可以通过依赖注入直接使用对象。这样就不用手动创建对象,把创建对象的权力交给 Spring,这就是控制反转,更贴切的说法应该是把创建对象的方式反转了
主要功能
- Bean 注册:根据 XML 配置文件或 Java 注解两种方式来创建和配置 Bean
- Bean 注入:也就是 DI 依赖注入
- Bean 管理:负责 Bean 的生命周期,包括实例化、初始化、属性赋值、DI、销毁等,还包括 Bean 的作用域
实现方式
- BeanFactory:Spring IoC 容器的最基本实现,它提供了懒加载(lazy loading)功能,即只有在真正需要时才会创建 Bean
- ApplicationContext:是 BeanFactory 的一个子接口,提供了更多的功能,如国际化、事件传播、AOP(面向切面编程)等
获取 IOC 容器
xml 方式
xml 配置文件
<!-- applicationContext.xml -->
<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">
<bean id="myBean" class="com.example.MyBean">
</bean>
</beans>
获取容器
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
// 加载 XML 配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取 bean
MyBean myBean = (MyBean) context.getBean("myBean");
}
}
注解方式
配置类
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.example") // 自动扫描指定包下的组件
public class AppConfig {
@Bean
public MyClass myBean() {
return new MyClass();
}
}
获取容器
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
// 加载 Java 配置类
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 获取 bean
MyBean myBean = context.getBean(MyBean.class);
}
}
springboot 方式
@SpringBootApplication
public class SpringIocApplication {
public static void main(String[] args) {
// run 方法的返回值就是容器
ConfigurableApplicationContext ioc = SpringApplication.run(SpringIocApplication.class, args);
// 所有的 bean(输出 bean 名称)
String[] beanDefinitionNames = ioc.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
@Bean
public MyClass myBean() {
return new MyClass();
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步