共计 2325 个字符,预计需要花费 6 分钟才能阅读完成。
学习几个十分罕用的然而也非常简单的 Spring 注解。只是做个简略阐明,具体可参考 Spring 官网,说的很具体。
@Primary
其实后面几篇文章曾经做过理解了,咱们晓得 Spring 主动拆卸的时候首先是按类型获取候选对象的,那就有可能有多个对象同时满足,这种状况下被 @Primary 注解标注的 Bean 会最终被选中并注入。
@Qualifier
有多个候选对象的状况下,还能够应用 @Qualifier 注解帮忙 Spring 放大抉择范畴。
@Qualifier 能够和 @Autowired 配合,作用在属性上或者办法参数上:
public class MovieRecommender {
// 作用在属性上
@Autowired
@Qualifier("main")
private MovieCatalog movieCatalog;
// 作用在办法参数上
@Autowired
public void prepare(@Qualifier("main") MovieCatalog movieCatalog,
CustomerPreferenceDao customerPreferenceDao) {
this.movieCatalog = movieCatalog;
this.customerPreferenceDao = customerPreferenceDao;
}
}
属性或参数名称是默认的 Qulifier,不须要显式指定。
@Resource
@Resource 是 JSR-250 注解 (jakarta.annotation.Resource),能够作用在属性或者 Setter 办法上(CommonAnnotationBeanPostProcessor 解决)。
@Resource 有一个 name 属性:
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Resource(name="myMovieFinder")
public void setMovieFinder(MovieFinder movieFinder) {this.movieFinder = movieFinder;}
}
Spring 注入的时候将指定的 name 作为 bean name 去容器中查找,不指定 name 的话 Spring 默认以 @Resource 作用的属性名作为 bean name 查找。
能够通过配置 Spring 的 SimpleJndiBeanFactory 以扭转 Spring 的默认行为:通过 JNDI 查找 bean,然而 Spring 官网倡议放弃 Spring 的默认属性、通过 bean name 匹配。
@Autowired 和 @Resource 的区别
两者都能够用来实现 bena 的注入,次要区别是依赖注入过程中的查找 bean 的规定不同。
@Autowire 首先是 byType + @Qulifier 找到所有候选对象,之后如果候选对象比拟多的话,通过 @Primary 过滤,如果没有指定 @Primary bean 的话,再 by name 匹配。
@Resource 实现通过 name 查找,匹配不到的话再通过 type 匹配。
所以两者查找 bean 的形式不同。
@Value
@Value 注解用来将配置文件中指定的数据拆卸到 bean 中,能够拆卸到属性或者办法参数中。
比方:
@Component
public class MovieRecommender {
private final String catalog;
public MovieRecommender(@Value("${catalog.name}") String catalog) {this.catalog = catalog;}
}
Configation 类文件:
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {}
配置文件 application.properties:
catalog.name=MovieCatalog
那么,“MovieCatalog”会注入到办法 MovieRecommender 的参数 catalog 中。
默认状况下,如果属性值不存在的话(配置文件中没有配置),属性名会作为值拆卸进去,不如上述案例如果属性文件不存在的话,catalog=“catalog.name”,其实这种解决形式很不谨严。
能够配置 PropertySourcesPlaceholderConfigurer 来批改这一默认行为:
@Configuration
public class AppConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {return new PropertySourcesPlaceholderConfigurer();
}
}
减少 PropertySourcesPlaceholderConfigurer 配置之后,配置缺失会导致 Spring 初始化失败。
@PostConstruct
注解的名字曾经可能表白他的性能了,作用在办法上,在 Bean 被实例化之后调用。
@Resource、@PostConstruct 和 @PreDestroy 注解是 JAVA6 到 JAVA8 版本的规范性能,然而从 JDK9 之后开始逐渐被移出,到 JAVA11 曾经被彻底移出,迁徙到 jakarta.annotation 中了,所以 JAVA 根底我的项目中如果要应用的话须要引入 jakarta.annotation-api 依赖。
上一篇 Spring FrameWork 从入门到 NB - 基于注解配置 & @Autowired 注解