Spring框架中的@Import、@ImportResource注解


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());

    }
}

結果:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM