0
点赞
收藏
分享

微信扫一扫

【网络安全】护网

目录

1、@Order 注解改变Bean自动注入的顺序

1.1、了解@SpringBootTest注解

1.2、@Order 注解改变Bean自动注入的顺序

2、@DependsOn 改变Bean的创建顺序

1、@Order 注解改变Bean自动注入的顺序

1.1、了解@SpringBootTest注解

1.2、@Order 注解改变Bean自动注入的顺序

相关代码

//接口
public interface I {
}


//接口I的实现类A
public class A implements I{
    public A(){
        System.out.println("A");
    }
}


//接口I的实现类A
public class B implements I{
    public B(){
        System.out.println("B");
    }
}


//测试类TestOrder
//@SpringBootTest(classes = 启动类名称.class),这里配置了TestOrder.class为项目启动类
@SpringBootTest(classes = TestOrder.class)
public class TestOrder {

    @Bean
    public A a(){
        return new A();
    }

    @Bean
    public B b(){
        return new B();
    }

    @Test
    public void test(@Autowired List<I> i){
        //这里不用List集合的话就只能获取一个I的bean,
        //但是I是有两个实现类的bean,这时候它不知道注入哪一个,就会报错,
        //使用了List集合的话,就会把I的两个实现类的bean都注入到List集合中
        System.out.println(i);
        //没有使用@Order注解时的打印结果为:[com.lt.order.A@4760f169, com.lt.order.B@261ea657]
        //这时候是A在前面,B在后面
    }

}

示例:

用法一,直接加注解,@Order注解中的属性值越小就排的越前

@SpringBootTest(classes = TestOrder.class)
public class TestOrder {
    @Bean
    @Order(1)
    public A a(){
        return new A();
    }

    @Bean
    @Order(0) // 谁小谁在前面
    public B b(){
        return new B();
    }

    @Test
    public void test(@Autowired List<I> i){
        System.out.println(i);
        //使用@Order注解后的打印结果为:[com.lt.order.B@261ea657, com.lt.order.A@4760f169]
        //这时候变成了B在前面,A在后面
    }
}

用法二,实现Ordered接口,重写接口中的getOrder()方法,这个方法的返回值越小,实现类作为bean在List数组中就排的越前面。这下面代码的结果和上面直接加注解的结果一样

public class A implements I, Ordered {
    public A(){
        System.out.println("A");
    }

    @Override
    public int getOrder() {
        return 1;
    }
}


public class B implements I, Ordered {
    public B(){
        System.out.println("B");
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

2、@DependsOn 改变Bean的创建顺序

@DependsOn注解可以作用在方法和类上。

(1)当@DependsOn注解作用在类上时

示例:

代码:还没使用@DependsOn注解

//事件源EventSource,在com.lt.dependsOn包下
@Component
public class EventSource {
    public EventSource(){
        //当调用这个无参构造函数创造bean时,就会执行这条打印语句
        System.out.println("事件源创建");
    }
}


//监听类EventTListener,在com.lt.dependsOn包下
@Component
public class EventTListener {
    public EventTListener(){
        //当调用这个无参构造函数创造bean时,就会执行这条打印语句
        System.out.println("监听器创建");
    }
}


//测试类TestDepends,在com.lt.dependsOn包下
@ComponentScan("com.lt.dependsOn")  //这里要指定扫描"com.lt.dependsOn"这个包,因为这时候用的是@Component来配置bean
@SpringBootTest(classes = TestDepends.class)
public class TestDepends {
    @Test
    public void test(){
    }
}

还没使用@DependsOn注解的运行结果

使用@DependsOn注解:

//事件源
@Component
@DependsOn(value = {"eventTListener"})
public class EventSource {
    public EventSource(){
        //当调用这个无参构造函数创造bean时,就会执行这条打印语句
        System.out.println("事件源创建");
    }
}

使用@DependsOn注解的运行结果:

(2)当@DependsOn注解作用在方法上时

测试类TestDepends代码:

//测试类
@SpringBootTest(classes = TestDepends.class)
public class TestDepends {

    @Bean
    @DependsOn(value = {"eventListener"})
    public EventSource eventSource(){
        return new EventSource();
    }

    @Bean
    public EventTListener eventListener(){
        return new EventTListener();
    }

    @Test
    public void test(){

    }
}

推荐: 
【Spring】依赖注入(DI)时常用的注解@Autowired和@Value-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137784706?spm=1001.2014.3001.5501

【Java网络编程】TCP通信(Socket 与 ServerSocket)和UDP通信的三种数据传输方式-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137926277?spm=1001.2014.3001.5501【Spring】使用@Bean和@Import注解配置Bean,与Bean的实例化_import和bean-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137257177?spm=1001.2014.3001.5501

举报

相关推荐

0 条评论