Spring注解@Configuration和Java Config

1. 从 Spring 3 起,JavaConfig 功能已经包含在 Spring 核心模块,它允许开发者将 bean 定义和在 Spring 配置 XML 文件到 Java 类中。但是,仍然允许使用经典的 XML 方式来定义 bean 和配置,JavaConfig 是另一种替代解决方案。所以,在 Spring3 以后的版本中,支持 xml 方式和 javaConfig 两种 Spring 配置方式。

我们通过 XML 方式定义:

复制代码
<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-3.0.xsd">
&lt;bean id="helloBean" class="com.yiibai.hello.impl.HelloWorldImpl"&gt;

</beans>

复制代码

等效于:

复制代码
package com.yiibai.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.yiibai.hello.HelloWorld;
import com.yiibai.hello.impl.HelloWorldImpl;

@Configuration
public class AppConfig {

@Bean(name="helloBean")
public HelloWorld helloWorld() {
    return new HelloWorldImpl();
}

}

复制代码

 2. 小例子:

a. 一个简单的 bean

复制代码
package com.spring;

public interface Helloeorld {

void printHelloWorld(String msg);

}

复制代码
复制代码
package com.spring;

public class HelloworldImpl implements Helloeorld{

@Override
public void printHelloWorld(String msg) {

    System.out.println("Hello : " + msg);
}

}

复制代码

b.javaConfig 注解:使用 @Configuration 注释告诉 Spring,这是核心的 Spring 配置文件,并通过 @Bean 定义 bean

复制代码
package com.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/使用 @Configuration 注释告诉 Spring,这是核心的 Spring 配置文件,
并通过 @Bean 定义 bean
/
@Configuration
public class TestConfig {

@Bean(name="helloeorld")
public Helloeorld getHello(){
    return new HelloworldImpl();
    
}

}

复制代码

c. 测试 main 方法:

复制代码
package com.spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestMain {

public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class);
Helloeorld obj = (Helloeorld) context.getBean("helloeorld");

   obj.printHelloWorld("Spring Java Config");

}

}

复制代码

3.@Import

在我们运用传统 xml 方式进行配置 Spring 时,可以通过如下方式加载多个配置文件:

复制代码
在一个大的项目结构,Spring bean 配置文件位于不同的文件夹以便于维护和模块化。例如,Spring-Common.xml 在 common 文件夹中,Spring-Connection.xml 在 connection 文件夹,Spring-ModuleA.xml 在 ModuleA 文件夹等等。
你可以加载多个 Spring bean 的配置文件如下代码中:
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"Spring-Common.xml",
              "Spring-Connection.xml","Spring-ModuleA.xml"});
把所有的 Spring XML 文件放入在项目类路径中。
    project-classpath/Spring-Common.xml
    project-classpath/Spring-Connection.xml
    project-classpath/Spring-ModuleA.xml
解决方法
以上方法是缺乏组织并且很容易出错,更好的办法应组织所有的 Spring bean 配置文件到一个 XML 文件。例如,创建一个 Spring-All-Module.xml 文件,并导入整个 Spring bean 的文件如下:
File : Spring-All-Module.xml
<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">
&lt;import resource="common/Spring-Common.xml"/&gt;
&lt;import resource="connection/Spring-Connection.xml"/&gt;
&lt;import resource="moduleA/Spring-ModuleA.xml"/&gt;    

</beans>
现在,可以加载一个这样的 XML 文件:

ApplicationContext context = new ClassPathXmlApplicationContext(Spring-All-Module.xml);
将这个文件放入项目的类路径。
project-classpath/Spring-All-Module.xml

复制代码

以上方式等效于 javaConfig 的如下方式:

复制代码
1. 两个简单的 Spring bean。
File One : CustomerBo.java

package com.yiibai.core;

public class CustomerBo {

public void printMsg(String msg) {

    System.out.println("CustomerBo : " + msg);
}

}
File Two: SchedulerBo.java

package com.yiibai.core;

public class SchedulerBo {

public void printMsg(String msg) {

    System.out.println("SchedulerBo : " + msg);
}

}
2. @Configuration 示例

现在,使用 JavaConfig @Configuration 声明上述 Bean 类。
File One: CustomerConfig.java

package com.yiibai.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.yiibai.core.CustomerBo;

@Configuration
public class CustomerConfig {

@Bean(name="customer")
public CustomerBo customerBo(){
    
    return new CustomerBo();
    
}

}
File Two: SchedulerConfig.java

package com.yiibai.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.yiibai.core.SchedulerBo;

@Configuration
public class SchedulerConfig {

@Bean(name="scheduler")
public SchedulerBo suchedulerBo(){
    
    return new SchedulerBo();
    
}

}
3. @Import 示例

使用 @Import 加载多个配置文件。
File : AppConfig.java

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 {

}
4. 执行程序

加载主配置文件,并进行测试。
package com.yiibai.core;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.yiibai.config.AppConfig;

public class App {
public static void main(String[] args) {

    ApplicationContext context = new AnnotationConfigApplicationContext(
            AppConfig.class);

    CustomerBo customer = (CustomerBo) context.getBean("customer");
    customer.printMsg("Hello 11");

    SchedulerBo scheduler = (SchedulerBo) context.getBean("scheduler");
    scheduler.printMsg("Hello 22");

}

}
输出结果

CustomerBo : Hello 11
SchedulerBo : Hello 22

复制代码

 

总结:Spring 有 xml 和 javaConfig 两种配置方式,他们方式不同,但效果相同,可以根据自己的需要进行选择性配置。