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 { ... ... }