Spring @Import注释

时间:2020-01-09 10:44:34  来源:igfitidea点击:

这篇文章展示了如何在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 {
	...
	...
}