java spring IOC的三种方式之XML形式

IOC

IOC就是将获取对象的方式将给框架,或者交给容器进行,有三种方式

  1. 基于Xml 元数据模式
  2. 基于注解的配置
  3. 基于Java config

XML形式

相关的注解

需要再相应的对象类class上使用 @Component修饰,表示是一个beacon。,然后再XML中配置,启动自动扫描,或者直接配置也可以,但是自动扫描会更好一些。

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd 
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd"
>
//自动扫描的
<context:component-scan base-package="com.demo.model"/>
//手动配置的,手动配置的话可以额外配置其他属性。比如这个<qualifier>
    <bean id="CleanAir" class="com.demo.model.CleanAir">
    	<qualifier value="cleanair"/> 
    </bean> 
    <bean id="DirtyAir" class="com.demo.model.DirtyAir">
    	<qualifier value="dirtyair"/>
    </bean>
    <bean id="person" class="com.demo.model.Person"/>
</beans>

对应的类

java 复制代码
package com.demo.model;

import org.springframework.stereotype.Component;

@Component
public class CleanAir implements IAir {
    @Override
    public String toString() {
    	
        return  "CleanAir";
    }
}
java 复制代码
package com.demo.model;

import org.springframework.stereotype.Component;

@Component
public class DirtyAir implements IAir {
    @Override
    public String toString() {
    	
        return  "DirtyAir";
    }
}
java 复制代码
package com.demo.model;

public interface IAir {

}
java 复制代码
package com.demo.model;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Person {
	
	//@Autowired //对构造函数进行标注

    public Person(@Qualifier("dirtyair")IAir air) {
        
        this.air = air;
    }
    
    IAir air;
    
    public void Breath()
    {
    	System.out.print(this.air.toString());
    }
}

Main函数

java 复制代码
package com.demo.ioc;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.demo.model.*;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {	//这个就是XML配置的,然后使用beanFactory进行获取bean。
        ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"ApplicationContext.xml"});
        BeanFactory factory=context;
        Person person=(Person)factory.getBean("person");


        person.Breath(); 
        
    }

}

其他

只使用@Qualifier("")注解,而不使用@Autowired 注解,为什么结果还是争取的呢

@Qualifier("") 注解和 @Autowired 注解都是 Spring 框架中的依赖注入注解。它们的作用是不同的。

@Autowired 注解用于自动装配 bean,它告诉 Spring 在相应的 bean 中查找匹配的依赖项并自动进行注入。如果没有找到匹配的 bean,Spring 会抛出 NoSuchBeanDefinitionException 异常。

@Qualifier 注解用于指定 bean 的名称,在有多个相同类型的 bean 时,通过指定 @Qualifier 注解可以明确指定需要注入哪一个 bean。如果没有指定 @Qualifier 注解或者指定的名称与实际的 bean 不匹配,Spring 会抛出 BeanCreationException 异常。

如果你只使用 @Qualifier("") 注解而不使用 @Autowired 注解,这实际上是告诉 Spring 你想要手动指定要注入的 bean。但如果你没有在相应的 bean 中使用 @Qualifier 注解来指定名称,或者没有在 Spring 配置中定义相应的 bean,那么 Spring 就无法找到要注入的 bean,结果会是相同的。

因此,如果你只使用 @Qualifier 而不使用 @Autowired,你必须确保在 Spring 配置中定义了相应的 bean,并在需要注入的类中手动使用 @Qualifier 注解来指定名称。否则,结果将是争取的。

相关推荐
MacroZheng4 分钟前
完美替代 Navicat!这款内置 AI 的数据库工具,太香了!
java·后端·mysql
SamDeepThinking30 分钟前
从REST到gRPC,一个API选型的思考框架
java·后端·程序员
Zane199433 分钟前
接口都能写默认实现了,为什么还需要抽象类
java·后端
未秃头的程序猿35 分钟前
读Spring AI源码的方法——不是硬啃,是带着问题去翻
java·后端·spring
用户3126874877201 小时前
别再 Thread.sleep 硬等了!并发工具类到底怎么选?
java
Java内核笔记1 小时前
万字长文剖析 Spring Boot 4 自动配置机制源码:从 @EnableAutoConfiguration 到条件装配
java·后端
evans在进步1 小时前
Spring MVC 核心机制详解:全局异常处理、请求跳转与数据绑定
java·spring·mvc
weixin_BYSJ19871 小时前
springboot小区物业管理小程序---附源码45555
java·javascript·spring boot·python·django·flask·php
coder_lorraine1 小时前
Halo 2.x 回收站文章无法删除?一篇文章教你彻底解决
java·运维
索隆zoro1 小时前
Army 进阶:DML 操作体系与 Spring AI 集成
java