spring@Import
- @Import注解在4.2之前只支持導入配置類
- 在4.2,@Import注解支持導入普通的java類,並將其聲明成一個bean
使用場景:
import注解主要用在基於java代碼顯式創建bean的過程中,用於將多個分散的java config配置類融合成一個更大的config類。其實除了 import注解外,還有 importResource注解,其作用都類似。配置類的組合主要發生在跨模塊或跨包的配置類引用過程中。
示例1:
一般來說, 需要按模塊或類別 分割Spring XML bean文件 成多個小文件, 使事情更容易維護和模塊化。 例如,
<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 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <import resource="config/customer.xml"/> <import resource="config/scheduler.xml"/> </beans>
Spring3 JavaConfig它等效於 @Import 功能
package com.yiibai.config; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Configuration @Import({ CustomerConfig.class, SchedulerConfig.class }) public class AppConfig { }
在列表中,@Import 是被用來整合所有在@Configuration注解中定義的bean配置。這其實很像我們將多個XML配置文件導入到單個文件的情形。@Import注解實現了相同的功能。本文會介紹使用@Import注解來導入spring工程中的JavaConfig文件.
在下面的例子中,我創建了兩個配置文件,然后導入到主配置文件中。最后使用主配置文件來創建context.
示例2:spring4.2之前導入配置類
//Car.java package javabeat.net.basic; public interface Car { public void print(); } //Toyota.java package javabeat.net.basic; import org.springframework.stereotype.Component; @Component public class Toyota implements Car{ public void print(){ System.out.println("I am Toyota"); } } //Volkswagen.java package javabeat.net.basic; import org.springframework.stereotype.Component; @Component public class Volkswagen implements Car{ public void print(){ System.out.println("I am Volkswagen"); } } //JavaConfigA.java package javabeat.net.basic; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JavaConfigA { @Bean(name="volkswagen") public Car getVolkswagen(){ return new Volkswagen(); } } //JavaConfigB.java package javabeat.net.basic; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JavaConfigB { @Bean(name="toyota") public Car getToyota(){ return new Toyota(); } } //ParentConfig.java package javabeat.net.basic; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Configuration @Import({JavaConfigA.class,JavaConfigB.class}) public class ParentConfig { //Any other bean definitions } //ContextLoader.java package javabeat.net.basic; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class ContextLoader { public static void main (String args[]){ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ParentConfig.class); Car car = (Toyota)context.getBean("toyota"); car.print(); car = (Volkswagen)context.getBean("volkswagen"); car.print(); context.close(); } }
程序執行輸出
I am Toyata
I am Volkswagen
示例3:spring4.2之后導入普通java bean
package com.dxz.imports; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Configuration @Import(DemoService.class) // 在spring 4.2之前是不不支持的 public class DemoConfig { } package com.dxz.imports; public class DemoService { public void doSomething() { System.out.println("everything is all fine"); } } package com.dxz.imports; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Test { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.dxz.imports"); DemoService ds = context.getBean(DemoService.class); ds.doSomething(); } }
結果:
everything is all fine
總結
本文作者介紹了@Import注解的使用。這個注解幫助我們將多個配置文件(可能是按功能分,或是按業務分)導入到單個主配置中,以避免將所有配置寫在一個配置中。
二、@ImportResource
相當於:
<import resource="applicationContext-democonfig2.xml" />
示例4:
學習如何使用@ImportResource 和 @Value 注解進行資源文件讀取
例子:
先創建一個MyDriverManager類(模擬讀取數據庫配置信息)
package com.dxz.imports4; public class MyDriverManager { public MyDriverManager(String url, String username, String password) { System.out.println("url : " + url); System.out.println("username : " + username); System.out.println("password : " + password); } }
創建StoreConfig
package com.dxz.imports4; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; @Configuration @ImportResource("classpath:applicationContext-democonfig2.xml") public class StoreConfig { @Value("${url}") private String url; @Value("${username}") private String username; @Value("${password}") private String password; @Bean public MyDriverManager myDriverManager() { return new MyDriverManager(url, username, password); } }
XML配置(context:property-placeholder 指定資源文件的位置)applicationContext-democonfig2.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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> <context:property-placeholder location="classpath:config4.properties" /> <context:component-scan base-package="com.dxz.imports4"> </context:component-scan> </beans>
創建資源文件config4.properties
url=127.0.0.1
username=root
password=123456
單元測試:
package com.dxz.imports4; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UnitTest { @Test public void test() { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext-democonfig2.xml"); MyDriverManager service = (MyDriverManager) context.getBean("myDriverManager"); System.out.println(service.getClass().getName()); } }
結果:

