【Java】Spring IoC中的相关注解
Spring IoC中除了基础的@Bean
,@Compoent
,@RestController
还有一些其他的注解可以用来控制Bean注入的时机一起来了解一下吧。
目录
- @Lazy 懒加载注解
- @Conditional 条件注解
- @DependsOn 依赖注解
- @Order 注入顺序注解
@Lazy 懒加载注解
@Lazy
注解会延迟初始化这个Bean
当类上没有加@Lazy
注解时,项目启动就会初始化这个Bean
当类上加上@Lazy
注解时,只有真正使用到这个Bean,才会被初始化并注入的IoC容器中。
@Lazy
@Component
public class UserServiceImpl{public UserServiceImpl(){System.out.println("UserServiceImpl");}
}
@Lazy
也可以写在属性上用来避免循环依赖。如下代码,如果没有使用@Lazy
则会出现循环依赖导致启动失败。
@Component
public class UserServiceImpl{@Lazy@Autowiredprivate UserServiceImpl userService;public UserServiceImpl(){System.out.println("UserServiceImpl");}
}
@Conditional 条件注解
在类上加上@Conditional
注解,然后自定一个实现类实现Condition
接口,并且@Conditional
关联到这个接口即可。
该接口只有一个实现方法,返回boolean类型,返回true则表示要注入到Ioc容器中,返回false则相反。
@Conditional(MyConditional.class)
@Component
public class UserServiceImpl{public UserServiceImpl(){System.out.println("UserServiceImpl");}
}
public class MyConditional implements Condition{@Overridepublic boolean matches(ConditionContext context,AnnotatedTypeMatadata metadata){return false;}
}
@DependsOn 依赖注解
表示该Bean初始化是依赖某个Bean,需要等依赖的Bean初始化完成后再注入到IoC容器中。
这个可以用来控制Bean的初始化顺序。
@DependsOn("userServiceImpl2")
@Component
public class UserServiceImpl{@Autowiredprivate UserServiceImpl userService;public UserServiceImpl(){System.out.println("UserServiceImpl");}
}
@Component
public class UserServiceImpl2{@Autowiredprivate UserServiceImpl userService;public UserServiceImpl(){System.out.println("UserServiceImpl2");}
}
@Order 注入顺序注解
Person接口有两个实现类,
UserController 使用List 将两个实现类都注入进来,那么List中的顺序是如何的呢?
如果没有使用@Order
注解默认情况下是要做编码顺序来的也就是[PersonServiceImpl1,PersonServiceImpl2]
如果按照如下使用@Order
注解则顺序是[PersonServiceImpl2,PersonServiceImpl1]
@Order
注解中的值越小优先级越高
注意:@Order
只影响依赖注入的顺序,不会影响Bean初始化的顺序。
Bean初始化的顺序依然是采用@DependsOn
注解来控制的。因此按照如下代码初始化顺序依然是默认的源码顺序也就是
[PersonServiceImpl1,PersonServiceImpl2]
public interface Person{
}
@Order(2)
@Component
public class PersonServiceImpl1 implements Person{public PersonServiceImpl1(){System.out.println("PersonServiceImpl1");}
}
@Order(1)
@Component
public class PersonServiceImpl2 implements Person{public PersonServiceImpl2(){System.out.println("PersonServiceImpl2");}
}
@RestController
public class UserController{public UserController(List<Person> personList){System.out.println(personList.size());System.out.println("UserController");}
}