我们来自定义一个Condition实现自动装配
首先创建一个接口
然后创建两个实现类
package com.gcx.spring.SpringBootAutoConfiguration;
public class GBKEncodingConvert implements EncodingConvert{
}
package com.gcx.spring.SpringBootAutoConfiguration;
public class UTF8EncodingConvert implements EncodingConvert{
}
创建一个配置类
package com.gcx.spring.SpringBootAutoConfiguration;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
/**
* Conditional基于条件的自动配置,一般和Condition接口配合使用他是一个数组,只有接口的都满足实现类返回true才会进行装配
* 如果装配在方法上只会对这个方法有效,要是在类上对这个的所有方法都生效
* @author gcx
*
*/
@SpringBootConfiguration
@Conditional(UTF8Condition.class)
public class EncodingConvertConfig {
@Bean
//@Conditional(UTF8Condition.class)
public EncodingConvert createUTF8EncodingConvert(){
return new UTF8EncodingConvert();
}
@Bean
//@Conditional(GBKCondition.class)
public EncodingConvert createGBKEncodingConvert(){
return new GBKEncodingConvert();
}
}
创建两个子类实现Condition
package com.gcx.spring.SpringBootAutoConfiguration;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class UTF8Condition implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String encoding=System.getProperty("file.encoding");
if(encoding!=null){
return "utf-8".equals(encoding.toLowerCase());
}
return false;
}
}
package com.gcx.spring.SpringBootAutoConfiguration;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class GBKCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String encoding=System.getProperty("file.encoding");
if(encoding!=null){
return "gbk".equals(encoding.toLowerCase());
}
return false;
}
}
默认的System.getProperty(“file.encoding”)是UTF-8
也可以在Argument中指定,他就会走你指定的
以上是我们自定义实现的自动配置
SpringBoot提供大量的自动配置,我们例举三个实例
创建一个UserConfiguration类·
package com.gcx.spring.SpringBootAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class UserConfiguration {
@Bean
@ConditionalOnProperty(name="runnable.enabled",havingValue="true",matchIfMissing=true)
public Runnable createRunnable(){
return () -> {};
}
@Bean
@ConditionalOnClass(name="com.google.gson.Gson")
public Runnable getGsonrunnable(){
return () -> {};
}
@Bean
@ConditionalOnBean(name="user")
public Runnable getUserRunnable(){
return () -> {};
}
}
@ConditionalOnProprtty 某个属性等于某个值时会触发自动配置 runnable.enabled在application.properties设置true,并且havingValue="true“时会自动配置,当我们不想
在application.properties中设置为true,可以添加matchIFmissing="true" 即便是不存在这个配置(runnable.enabled)也会自动配置
@ConditionalOnClass 当这个类在classpath存在时会自动配置,不存在就不能自动配置上
@ConditionalOnBean 如果这个名字为user的这个类存在时会装配,否则不会自动装配
要是有兴趣研究在这个路径下自己尝试,这里不一一列举
以上就是有关自动配置的说明!