Spring系列第22篇:@Scope、@DependsOn、@ImportResource、@Lazy 详解

import org.springframework.context.annotation.DependsOn;

@Configurable

public class MainConfig4 {

@Bean

@DependsOn({“service2”, “service3”})//@1

public Service1 service1() {

return new Service1();

}

@Bean

public Service2 service2() {

return new Service2();

}

@Bean

public Service3 service3() {

return new Service3();

}

}

上面是一个spring的配置类,类中3个方法定义了3个bean

@1:这个地方使用了@DependsOn,表示service1这个bean创建之前,会先创建好service2和service3

来个测试用例

@Test

public void test4() {

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig4.class);

System.out.println(context.getBean(com.javacode2018.lesson001.demo27.test4.Service1.class));

}

运行输出

create Service2

create Service3

create Service1

com.javacode2018.lesson001.demo27.test4.Service1@6e20b53a

@ImportResource:配置类中导入bean定义的配置文件


用法

有些项目,前期可能采用xml的方式配置bean,后期可能想采用spring注解的方式来重构项目,但是有些老的模块可能还是xml的方式,spring为了方便在注解方式中兼容老的xml的方式,提供了@ImportResource注解来引入bean定义的配置文件。

bean定义配置文件:目前我们主要介绍了xml的方式,还有一种properties文件的方式,以后我们会介绍,此时我们还是以引入bean xml来做说明。

看一下这个注解的定义:

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.TYPE)

@Documented

public @interface ImportResource {

@AliasFor(“locations”)

String[] value() default {};

@AliasFor(“value”)

String[] locations() default {};

Class<? extends BeanDefinitionReader> reader() default BeanDefinitionReader.class;

}

通常将其用在配置类上。

有3个参数:

  • value和locations效果一样,只能配置其中一个,是一个string类型的数组,用来指定需要导入的配置文件的路径。
  • reader:用来指定bean定义的读取器,目前我们知道的配置bean的方式有xml文件的方式,注解的方式,其实还有其他的方式,比如properties文件的方式,如果用其他的方式,你得告诉spring具体要用那种解析器去解析这个bean配置文件,这个解析器就是BeanDefinitionReader,以后我们讲BeanDefinition的时候再细说。

资源文件路径的写法

通常我们的项是采用maven来组织的,配置文件一般会放在resources目录,这个目录中的文件被编译之后会在target/classes目录中。

spring中资源文件路径最常用的有2种写法:

  1. 以classpath:开头:检索目标为当前项目的classes目录

  2. 以classpath*:开头:检索目标为当前项目的classes目录,以及项目中所有jar包中的目录,如果你确定jar不是检索目标,就不要用这种方式,由于需要扫描所有jar包,所以速度相对于第一种会慢一些

那我们再来说classpath:和classpath*:后面的部分,后面的部分是确定资源文件的位置地方,几种常见的如下:

相对路径的方式

classpath:com/javacode2018/lesson001/demo27/test5/beans.xml

或者

classpath*:com/javacode2018/lesson001/demo27/test5/beans.xml

/:绝对路径的方式

classpath:/com/javacode2018/lesson001/demo27/test5/beans.xml

*:文件通配符的方式

classpath:/com/javacode2018/lesson001/demo27/test5/beans-*.xml

会匹配test5目录中所有以beans-开头的xml结尾的文件

*:目录通配符的方式

classpath:/com/javacode2018/lesson001/demo27//beans-.xml

会匹配demo27中所有子目录中所有以beans-开头

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值