学习几个十分罕用的然而也非常简单的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中,能够拆卸到属性或者办法参数中。

比方:

@Componentpublic 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来批改这一默认行为:

@Configurationpublic 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注解