Spring-IOC实现【04-其他实现方式】

条件注解

Profile实际上就是条件注解的一种特殊形式,即条件注解更加灵活,用户可以根据各种不同的条件使用不同的Bean。
条件注解在SpringBoot中使用非常广泛。SpringBoot中提供了许多自动化的配置,例如数据库配置,SpringBoot使用条件注解提前配置好许多常用的类,使用条件注解,在某一个条件满足时,这些配置就会生效。

1、创建接口

package com.sxt.service;
/**
 * 条件注解
 * 1.定义接口
 * @author IF
 *
 */
public interface ShowCmd {

	String show();
}

2、实现接口

package com.sxt.service.impl;

import com.sxt.service.ShowCmd;

/**
 * 定义出接口的实现类
 * @author IF
 *
 */
public class LinuxShowCmd implements ShowCmd{

	@Override
	public String show() {
		// TODO Auto-generated method stub
		return "Liunx ls";
	}
}
package com.sxt.service.impl;

import com.sxt.service.ShowCmd;

/**
 * 注册接口的实现类
 * @author IF
 *
 */
public class WindowsShowCmd implements ShowCmd{

	@Override
	public String show() {
		return "Windows dir";
	}
}

3.定义条件Condition

package com.sxt.condition;


import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

/**
 * @author IF
 * 自定义的条件
 */
public class LinuxConditionShow implements Condition{
	/**
	 * 条件匹配的方法
	 * trur 条件匹配
	 * false 条件不匹配
	 */
	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		//获取profile参数
		String osName[] = context.getEnvironment().getActiveProfiles();
		for(String name :osName){
			System.out.println(name);
			if(name.contains("linux")){
				return true;
			}
		}
		
		return false;
	}

}

package com.sxt.condition;


import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

/**
 * @author IF
 * 自定义的条件
 */
public class WindowsConditionShow implements Condition{
	/**
	 * 条件匹配的方法
	 * trur 条件匹配
	 * false 条件不匹配
	 */
	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		//获取profile参数
		String osName[] = context.getEnvironment().getActiveProfiles();
		for(String name :osName){
			System.out.println(name);
			if(name.contains("windows")){
				return true;
			}
		}
		
		return false;
	}

}

4.java配置文件

package com.sxt.javaconfig;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

import com.sxt.condition.LinuxConditionShow;
import com.sxt.condition.WindowsConditionShow;
import com.sxt.service.impl.LinuxShowCmd;
import com.sxt.service.impl.WindowsShowCmd;

@Configuration
public class JavaConfig {
	@Bean("cmd")
	// 关联条件设置
	@Conditional(LinuxConditionShow.class)
	public LinuxShowCmd showLinux(){
		return new LinuxShowCmd();
	}
	@Bean("cmd")
	// 关联条件设置
	@Conditional(WindowsConditionShow.class)
	public WindowsShowCmd showWindows(){
		return new WindowsShowCmd();
	}
}

5.测试调用:
在这里插入图片描述
在这里插入图片描述

Bean的作用域

在这里插入图片描述

在spring的配置中,默认情况下,bean都是单例的(singleton)。无论获取多少次,获取到的都是同一个bean

application.xml配置文件中
在这里插入图片描述
测试:
在这里插入图片描述

混合配置

开发中可能既有配置文件存在,也在使用java配置的方式,这时候可以使用 @ImportResource 来实现

1、添加application.xml文件

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	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-4.3.xsd">
	
	<bean class="com.dpb.javabean.UserBean" ></bean>
</beans>

2、java配置文件

/**
 * 该类相当于 application.xml文件
 *
 */
@Configuration 
@ImportResource("classpath:application.xml")
public class AppJavaConfig {

	@Bean
	Book book(){
		return new Book();
	}
}

3、测试
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44502804/article/details/89390444