spring boot 三:4.底层注解@ImportResource导入spring配置文件
1 前言
springboot的底层注解,经常会使用@AliasFor作为注解的value的别名,比如下面@ImportResource注解,既可以使用value,也可以使用locations,一般不同时存在,如果同时存在时,必须值相等,否则抛错:
如下配置类:
启动主程序类:
修改为同一个值时:
启动主程序类无误
2 使用
在配置类上,增加@ImportResource注解,是为了导入spring的xml形式的bean,注册spring的这些xml形式组件。
比如resources目录下,新建一个beans.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="lizhi_fruit" class="com.xiaoxu.domain.Fruit">
<property name="fname" value="荔枝"/>
<property name="price" value="17.9"/>
<property name="count" value="999"/>
<property name="dropDate" value="2022/01/11"/>
</bean>
</beans>
实体类Fruit如下所示:
package com.xiaoxu.domain;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author xiaoxu
* @date 2022-01-07
* Ymybatis:com.xiaoxu.domain.Fruit
*/
@Component
@ConfigurationProperties(prefix = "new-fruit")
public class Fruit {
/**
* 水果名称
*/
private String fname;
/**
* 水果价格
*/
private BigDecimal price;
/**
* 水果数目
*/
private long count;
/**
* 水果过期时间
*/
private Date dropDate;
public Fruit() {
}
public Fruit(String fname, BigDecimal price, long count, Date dropDate) {
this.fname = fname;
this.price = price;
this.count = count;
this.dropDate = dropDate;
}
public Date getDropDate() {
return dropDate;
}
public void setDropDate(Date dropDate) {
this.dropDate = dropDate;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public long getCount() {
return count;
}
public void setCount(long count) {
this.count = count;
}
@Override
public String toString() {
return "水果{" +
"fname='" + fname + '\'' +
", price=" + price +
", count=" + count +
", dropDate=" + dropDate +
'}';
}
}
配置类修改如下:
package com.xiaoxu.config;
import com.xiaoxu.domain.Fruit;
import com.xiaoxu.domain.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.*;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author xiaoxu
* @date 2021-12-27
* Ymybatis:com.xiaoxu.config.MyConfig
*/
//@Import({User.class})
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(name = "my")
@ImportResource(value = "classpath:beans.xml",locations = "classpath:beans.xml")
public class MyConfig {
// @Bean(name = "fruit")
@Bean(name = "myfruit",value = "myfruit")
// @ConditionalOnBean(name = "myuser")
public Fruit getFruit() throws ParseException {
Fruit fruit = new Fruit();
fruit.setFname("桃子");
fruit.setPrice(new BigDecimal("12.5"));
fruit.setCount(120);
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(s.format(new Date()));
String d = s.format(new Date());
System.out.println(s.parse(d));
fruit.setDropDate(s.parse(d));
return fruit;
}
@Bean
public User getUser(){
User u=new User();
u.setName("xiaoxu");
u.setAge((byte)29);
u.setMoney(new BigDecimal("10"));
u.setId(1234);
return u;
}
}
修改主程序类,观察xml的lizhi_fruit组件是否注册成功:
package com.xiaoxu;
import com.xiaoxu.domain.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
/**
* @author xiaoxu
* @date 2022-01-07
* Ymybatis:com.xiaoxu.MainApplication
*/
@SpringBootApplication(scanBasePackages = {"com.xiaoxu"})
//@EnableAutoConfiguration
//@ComponentScan
//@SpringBootConfiguration
public class MainApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
System.out.println("*******开始*********");
User bean = run.getBean(User.class);
boolean myfruit = run.containsBean("myfruit");
System.out.println("是否存在组件myfruit:"+myfruit);
boolean getuser = run.containsBean("getUser");
System.out.println("是否存在组件myuser:"+getuser);
boolean lizhi = run.containsBean("lizhi_fruit");
System.out.println("是否存在组件lizhi:"+lizhi);
System.out.println("*******结束*********");
}
}
结果如下:
*******开始*********
是否存在组件myfruit:true
是否存在组件myuser:true
是否存在组件lizhi:true
*******结束*********