Spring @Import注释
这篇文章展示了如何在Spring中使用@Import注释。在一个应用程序中,我们可能有几个bean定义,这使@Configuration类非常庞大。可以将配置分为几个小配置模块,而不是将所有Bean定义放在一个配置类中。然后,使用Spring @Import注释,可以指定要导入到特定配置类中的配置类。
@Import注释类似于Spring XML中的<import />元素,该元素用于导入多个XML资源。这样,我们可以将一个较大的Spring XML配置文件拆分为较小的XML,然后导入这些资源。
与Spring中的@Import注释相同,可以从其他配置类中加载@Bean定义,因此我们可以按模块或者功能对配置进行拆分和分组,从而使代码易于维护。
Spring @Import注释示例
作为示例,我们可以采用需要执行以下操作的方案。
1.在一个配置类中注册数据源。
2.在单独的配置中注册DAO类,导入DBConfiguration类以从该配置类加载bean定义。
DBConfiguration类
该Java配置类用于提供与DB相关的配置。此处通过提供数据库属性来定义数据源(Apache DBCP)。请注意,属性存储在属性文件中。
import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
@Configuration("dbConfig")
@PropertySource(value="classpath:properties/db.properties")
public class DBConfiguration {
@Autowired
private Environment env;
@Bean
public BasicDataSource devDataSource() {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(env.getProperty("db.dev.driver_class_name"));
ds.setUrl(env.getProperty("db.dev.url"));
ds.setUsername(env.getProperty("db.dev.user"));
ds.setPassword(env.getProperty("db.dev.password"));
return ds;
}
}
properties / db.properties
#DB configuration for dev db.dev.url=jdbc:oracle:thin:@localhost:1521/XEPDB1 db.dev.user=test db.dev.password=test db.dev.driver_class_name=oracle.jdbc.driver.OracleDriver
UserConfig类别
还有另一个Java配置类,其中包含所有DAO的定义。
@Configuration
@Import(DBConfiguration.class)
public class UserConfig {
@Bean
public UserDAO userDAO() {
return new UserDAOImpl();
}
}
如我们在UserConfig类中所见,@Import注释用于从DBConfiguration类加载bean定义。
UserDAO界面
public interface UserDAO {
public void getUsers();
}
UserDAOImpl类
public class UserDAOImpl implements UserDAO {
@Autowired
BasicDataSource ds;
public void getUsers() {
System.out.println("In getUsers method, use DS to connect to DB");
System.out.println("Driver class name- " + ds.getDriverClassName());
System.out.println("DB User- " + ds.getUsername());
System.out.println("DB URL- " + ds.getUrl());
}
}
使用main方法的类来运行示例。
public class App {
public static void main(String[] args) {
AbstractApplicationContext context = new AnnotationConfigApplicationContext(UserConfig.class);
UserDAO userDAO = context.getBean("userDAO", UserDAOImpl.class);
userDAO.getUsers();
context.close();
}
}
在实例化上下文时,仅指定了UserConfig类,而不是同时指定了UserConfig和DBConfiguration类。在UserConfig类中使用@Import注释可确保还加载来自DBConfiguration的bean定义。
使用@Import加载多个配置类
我们还可以使用@Import注释指定多个配置类。在这种情况下,必须将类作为数组传递。
@Configuration
@Import({ConfigA.class, ConfigB.class, ConfigC.class})
public class ConfigD {
...
...
}

