IOC 容器

IOC 容器

IOC 全称是 Inversion of Control 即 控制反转,DI 全称是 Dependency Injection 即 依赖注入

IOC 是一种设计原则,DI 是 IOC 的实现,两者相辅相成,所以都说 Spring 是两大特性 IOC/DI 和 AOP

如果不使用 IOC,每次使用对象都要通过 new 来创建对象,然后给属性赋值,最后再使用。如果使用 IOC,通过 Spring 配置在程序启动的时候就把所有的对象创建好了,保存在 IOC 容器中,必要的属性也赋值好了,可以通过依赖注入直接使用对象。这样就不用手动创建对象,把创建对象的权力交给 Spring,这就是控制反转,更贴切的说法应该是把创建对象的方式反转了

主要功能

  1. Bean 注册:根据 XML 配置文件或 Java 注解两种方式来创建和配置 Bean
  2. Bean 注入:也就是 DI 依赖注入
  3. Bean 管理:负责 Bean 的生命周期,包括实例化、初始化、属性赋值、DI、销毁等,还包括 Bean 的作用域

实现方式

  1. BeanFactory:Spring IoC 容器的最基本实现,它提供了懒加载(lazy loading)功能,即只有在真正需要时才会创建 Bean
  2. 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();
    }

}
posted @   CyrusHuang  阅读(3)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示