SpringIOC

本文详细介绍了Spring框架中的InversionofControl(IOC)和依赖注入(DI)概念,包括XML配置、注解的使用以及从XML到JavaConfig的迁移,重点讲解了如何通过配置文件和注解来管理和解耦项目组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、SpringIOC理解


        关键字:IOC名词解释,作用是解耦,使用IOC容器管理项目组件之间的耦合关系
IOC( Inversion of Control,中文释义:控制反转  ) 是Spring框架的核心思想之一,主要用于解耦。IOC是指将创建对象的控制权转移给Spring框架进行管理。由Spring框架根据配置文件或注解等方式,创建bean对象并管理各个bean对象之间的依赖关系。使对象之间形成松散耦合的关系,实现解耦;

  •   控制 :指的是对象创建(实例化、管理)的权力
  •   反转 :控制权交给外部环境(Spring框架、IoC容器)

二、xml核心配置文件

2.5版本前====>xml

SpringDI(依赖注入)
        DI(Dependecy Inject,中文释义:依赖注入) 是对IOC概念的不同角度的描述,是指应用程序在运行时,每一个bean对象都依赖IOC容器注入当前bean对象所需要的另外一个bean对象。(例如在MyBatis整合Spring时,SqlSessionFactoryBean 依赖IOC容器注入一个 DataSource数据源bean);

DI实现方式:

  1. set注入=通过set方法维护对象之间的依赖关系
  2. 构造注入=通过构造方法维护对象之间的依赖关系
  3. 属性注入(不推荐)

DI注入的数据类型:

  1. 注入对象
  2. 注入基本类型与String
  3. 复杂类型list arry set map properties

set注入DI实现步骤:
1. 思考
2. 给属性提供set方法
3. 在bean标签内部开启配置
     配置位置:<bean>此位置</bean>
     配置语法:<property 属性名="属性值"></property>
     配置属性:
         name======》属性名称
         value=====》属性值
         ref=======》属性值的引用

 三、xml+注解


2.5版本后====>annonation+xml


替换:

    <bean id="" class="" init-method="" destroy-method="" scope="" autowire="">
        <property></property>
        <constructor-arg></constructor-arg>
    </bean>


   一、注入类


        @Component
            含义:将注解所修饰的类注入spring容器
            位置:类
            语法:@Component(value = "id")
                 如果省略value="id"默认注入的id为类的名称且首字母小写
            注意:  不可以单独使用<context:component-scan base-package=""></context:component-scan>

        @Repository 注入数据访问层
        @Service    注入业务层
        @Controller 注入控制层
            以上三个注解与@Component功能语法一致

    二.注入数据


        @Value()
            含义:向属性注入基本类型与String
            语法:@Value("数据")
                 @Value("${key}")
            位置:属性
            注意:不能单独使用
                <context:property-placeholder location=""></context:property-placeholder>
        @Autowired()
            替换:自动装配属性
            位置:属性
            含义:通过“set”方法【set方法可以省略】,按照“类型”自动装配,如果类型冲突则按照"名称"装配
            注意:
                1.按类型装配如果冲突切换为名称装配
                2.按类型装配如果冲突切换为名称装配,如果名称也没有则会抛异常
                    NoUniqueBeanDefinitionException
                3.按类型装配没一个匹配
                    NoSuchBeanDefinitionException

  四、纯注解


3.0版本后====>annonation+javaConfig配置类


        @Configuration
            含义:配置类
            注意:AnnotationConfigApplicationContext
        @ComponentScan
            替换:<context:component-scan base-package=""></context:component-scan>
        @PropertySource()
            替换:<context:property-placeholder location=""></context:property-placeholder>
        @Import()
            含义:导入其他配置类
        @Bean
            含义:注入类;方法返回值为class 方法名称为id
            位置:修饰方法
            注意:单独使用无需扫描

五、其他注解


      @Primary
            含义:在类型装配冲突的情况下,此注解所修饰的类作为首选项
            位置:类
            注意:不能单独用
        @Qualifier
            含义:按照名称装配
            位置:属性
            注意:不能单独用
        @Resource
            含义:按照名称装配
            位置:属性
            注意:单独用
        @Scope
            含义:作用域
            位置:类
            注意:不能单独用
            举例:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
        @PreDestroy
            含义:替换destory-method
            位置:方法
            注意:单独用
        @PostConstruct
            含义:替换init-method
            位置:方法
            注意:单独用

### Spring IOC 原理及实现 #### 1. 控制反转(IOC)的概念 控制反转(Inversion of Control,简称 IOC)是一种设计思想,旨在将对象的创建和管理从应用程序代码中分离出来。通过 IOC,开发者无需手动管理对象的生命周期和依赖关系,而是由框架负责这些任务。这种思想使得开发者可以专注于业务逻辑的实现,而不需要关心对象之间的交互细节[^1]。 #### 2. 依赖注入(DI) 依赖注入(Dependency Injection,简称 DI)是实现 IOC 的一种方式。DI 的核心在于通过外部配置或注解的方式,将对象的依赖关系注入到目标对象中,而不是由对象自己负责依赖的创建和管理。依赖注入有三种主要形式:构造器注入、Setter 方法注入和字段注入[^4]。 #### 3. Spring IOC 容器的核心接口 Spring 框架提供了两种主要的 IOC 容器接口: - **BeanFactory**:这是 Spring 框架的基础接口,面向 Spring 内部使用。它负责配置、创建和管理 Bean 的生命周期。 - **ApplicationContext**:这是一个更高级的容器接口,面向开发者使用。它扩展了 BeanFactory 的功能,提供了更多的企业级特性,如国际化支持、事件传播等。在实际开发中,通常使用 ApplicationContext 而非 BeanFactory[^2]。 #### 4. Spring IOC 的实现方式 Spring IOC 的实现主要包括以下几个方面: ##### (1) 元数据解析 Spring 使用 XML 文件、Java 注解或 Java 配置类来定义 Bean 的元数据。例如,通过 `<bean>` 标签在 XML 文件中定义 Bean,或者使用 `@Component`、`@Service` 等注解在 Java 类上声明 Bean[^5]。 示例代码(XML 配置): ```xml <bean id="userDao" class="com.mayuanfei.springioc.dao.impl.UserDaoImpl" /> ``` 示例代码(注解配置): ```java @Component public class UserDaoImpl implements UserDao { // 实现方法 } ``` ##### (2) 依赖注入 Spring 通过反射机制解析 Bean 的依赖关系,并将其注入到目标对象中。以下是一个简单的依赖注入示例: 示例代码(字段注入): ```java @Service public class UserService { @Autowired private UserDao userDao; // 自动注入 UserDao } ``` ##### (3) 生命周期管理 Spring 容器会管理 Bean 的整个生命周期,包括初始化、运行时和销毁阶段。开发者可以通过实现特定的接口(如 `InitializingBean` 和 `DisposableBean`)或使用注解(如 `@PostConstruct` 和 `@PreDestroy`)来定制 Bean 的生命周期行为。 示例代码(生命周期管理): ```java @Component public class MyBean { @PostConstruct public void init() { System.out.println("Bean 初始化"); } @PreDestroy public void destroy() { System.out.println("Bean 销毁"); } } ``` ##### (4) 扩展机制 Spring 提供了丰富的扩展点,允许开发者自定义容器的行为。例如,通过实现 `BeanFactoryPostProcessor` 或 `BeanPostProcessor` 接口,可以在 Bean 初始化前后插入自定义逻辑[^4]。 #### 5. Spring IOC 的优势 Spring IOC 的核心优势包括: - **解耦**:对象之间不再直接依赖具体实现,而是通过接口或抽象类进行交互。 - **灵活性**:通过配置文件或注解动态管理 Bean,便于修改和扩展。 - **可维护性**:集中处理对象的创建和依赖关系,降低了代码复杂度。 ### 总结 Spring IOC 是一种通过容器管理对象生命周期和依赖关系的设计模式。其核心原理包括元数据解析、依赖注入、生命周期管理和扩展机制。通过这些机制,Spring 实现了对象控制权的反转,从而提高了系统的解耦性、灵活性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值