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 注解来指定名称。否则,结果将是争取的。

相关推荐
互联网全栈架构34 分钟前
遨游Spring AI:第一盘菜Hello World
java·人工智能·后端·spring
优秀的颜2 小时前
计算机基础知识(第五篇)
java·开发语言·分布式
BillKu2 小时前
Java严格模式withResolverStyle解析日期错误及解决方案
java
网安INF2 小时前
ElGamal加密算法:离散对数难题的安全基石
java·网络安全·密码学
AWS官方合作商3 小时前
在CSDN发布AWS Proton解决方案:实现云原生应用的标准化部署
java·云原生·aws
gadiaola4 小时前
【JVM】Java虚拟机(二)——垃圾回收
java·jvm
coderSong25686 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
Mr_Air_Boy7 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
豆沙沙包?8 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
年老体衰按不动键盘8 小时前
快速部署和启动Vue3项目
java·javascript·vue