Spring框架常用注解
@Import注解 —— 导入资源
自定义类导入spring容器
创建需要导入的类
public class CatImport { }启动时手动导入
@Import(CatImport.class}) @SpringBootApplication(scanBasePackages = {"com.cyn.config"}) public class SpringAnnotationApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(SpringAnnotationApplication.class, args); CatImport catImport = context.getBean(CatImport.class); System.out.println(catImport); } }输出
com.cyn.config.CatImport@35f26e72从输出结果知,
@Import注解把用到的bean导入到了当前容器中。
@ConfigurationProperties —— 配置加载
常用于个性化配置文件。编写项目代码时,我们要求更灵活的配置,更好的模块化整合。通常情况下,我们可以使用 @Value 注解或着使用 Spring Environmen bean 访问这些属性。
一般情况下如果一个项目中写了很多个配置,例如
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
spring.datasource.username=cyn
spring.datasource.password=cyn
这种情况下,我们在使用时,按照原有的配置读取就会比较繁琐
public class TestConfig {
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
// :后代表取不到时的默认值
@Value("${spring.datasource.url:default}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
}
这种使用@Value注入配置方式有时显得很笨重
我们将使用更安全的方式(@ConfigurationProperties )来获取这些属性
@Data
@ConfigurationProperties(prefix="spring.datasource")
public class TestConfigProperties {
private String driverClassName;
private String url;
private String username;
private String password;
}
@ConfigurationProperties 的基本用法非常简单:我们为每个要捕获的外部属性提供一个带有字段的类。请注意以下几点:
- 前缀定义了哪些外部属性将绑定到类的字段上
- 根据 Spring Boot 宽松的绑定规则,类的属性名称必须与外部属性的名称匹配
- 我们可以简单地用一个值初始化一个字段来定义一个默认值
- 类本身可以是包私有的
- 类的字段必须有公共 setter 方法
参考:
@PostConstruct —— Bean初始化
如果一个类A中有个成员变量p被@Autowried注解,那么@Autowired注入是发生在A的构造方法执行完之后的。
如果想在生成对象时完成某些初始化操作,依赖于依赖注入,那么就无法在构造函数中实现。
可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
@Component
public class PostConstructDemo {
public PostConstructDemo() {
System.out.println("ParentBean construct");
}
@Bean
public DemoA getDemoA() {
return new DemoA("DemoA init");
}
@PostConstruct
public void init() {
System.out.println(getDemoA());
System.out.println("ParentBean init");
}
}
测试:
@SpringBootApplication(scanBasePackages = {"com.cyn"})
public class SpringAnnotationApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringAnnotationApplication.class, args);
PostConstructDemo postConstructDemo = context.getBean(PostConstructDemo.class);
}
}
输出:
ParentBean construct
DemoA{name='DemoA init'}
ParentBean init
可以看出执行顺序: Constructor » @Autowired » @PostConstruct
@Resource – 依赖注入
@Autowired与@Resource都可以用来装配bean,都可以写在字段或setter方法上
@Autowired默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性为false。如果想使用名称装配可以结合@Qualifier注解进行使用。
@Resource,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行名称查找。如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。