条件注解
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、测试