乐趣区

关于java:Spring-FrameWork从入门到NB-primaryQualifierResourceValue

学习几个十分罕用的然而也非常简单的 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 注解

退出移动版