springboot手动装配 - Go语言中文社区

springboot手动装配


一 自定义@Enable模块

【1】、基于注解驱动实现

1、建一个config类

public class HelloWorldConfig {
    @Bean
    Lfh lfh () {
        System.out.println("-------------->初始化");
        return new Lfh();
    }
}
public class Lfh {
    public String hi() {
        return "hello world";
    }
}

2、自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({HelloWorldConfig.class})  //HelloWorldConfig 自定义的配置类
public @interface HelloWorld {
}

3、装配

@HelloWorld  //自定义注解 启动时装配
@SpringBootApplication
public class SpringbootLearnApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringbootLearnApplication.class, args);
	}

}

4、这样在项目中可以直接使用了

    @Autowired
    Lfh lfh;

    @GetMapping("/hi")
    public String hi() {
        return lfh.hi();
    }

5、启动项目
在这里插入图片描述
输出
在这里插入图片描述
PS:可参考@EnableWebMvc注解。

【2】、基于接口驱动实现

1、再建一个类

public class HelloWorldConfig2 {
    @Bean
    Lfh lfh () {
        System.out.println("-------------->初始化");
        return new Lfh();
    }
}

2、自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({HelloWorldConfigSelecltor.class})  //HelloWorldConfigSelecltor 自定义的配置类
public @interface HelloWorldSelector {
    boolean isLinux() default false;
}

3、选择性装配 ,新建config类,引入ImportSelector接口

//选择性装配
public class HelloWorldConfigSelecltor implements ImportSelector{

    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        Map<String, Object> attributesMap = annotationMetadata.getAnnotationAttributes(HelloWorldSelector.class.getName());
        //获取接口中islinux值,根据不同的值装配不同的配置
        boolean islinux = (boolean) attributesMap.get("isLinux");
        if(islinux) {
            return new String[]{HelloWorldConfig.class.getName()};
        } else {
            return new String[]{HelloWorldConfig2.class.getName()};
        }
    }
}

4、装配

//@HelloWorld  //自定义注解 启动时装配
//isLinux = false ,装配HelloWorldConfig2
@HelloWorldSelector(isLinux = false)  
@SpringBootApplication
public class SpringbootLearnApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringbootLearnApplication.class, args);
	}

}

5、启动项目
在这里插入图片描述
PS : 参考@EnableCaching注解

二 、条件装配

实现Condition接口,并实现matches()方法,如果matches方法返回true,那么带有@Conditional注解的bean就会装载,false就不会装载

1、自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnSystemCondition.class}) //这里不再是Import接口,而是Conditional
public @interface ConditionalSystem {
    String system();
}

2、新建配置类

public class OnSystemCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        Map<String, Object> attributesMap = annotatedTypeMetadata.getAnnotationAttributes(ConditionalSystem.class.getName());
        System.out.println("------------------?system-->" + attributesMap.get("system"));
         //条件配置,返回true是才装配
        return "linux".equals(attributesMap.get("system").toString());
    }
}

3、在HelloWorldConfig类和HelloWorldConfig2类上使用注解

@ConditionalSystem(system = "windows")  //条件装配
public class HelloWorldConfig {


@ConditionalSystem(system = "linux")  //条件装配
public class HelloWorldConfig2 {

4、运行逻辑
首先根据@HelloWorldSelector(isLinux = false) 选择加载 HelloWorldConfig2,
再根据HelloWorldConfig上的@ConditionalSystem(system = “linux”) 的system = "linux"的条件进行判断,true加载,false不加载。

PS:参考@ConditionalOnBean注解。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Demo_gui/article/details/89285330
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢