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

IOC

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

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

XML形式

相关的注解

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


<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>

对应的类

package com.demo.model;

import org.springframework.stereotype.Component;

@Component
public class CleanAir implements IAir {
    @Override
    public String toString() {
    	
        return  "CleanAir";
    }
}

package com.demo.model;

import org.springframework.stereotype.Component;

@Component
public class DirtyAir implements IAir {
    @Override
    public String toString() {
    	
        return  "DirtyAir";
    }
}

package com.demo.model;

public interface IAir {

}

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函数

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

你可能感兴趣的:(java)