`

Spring里同时使用@Configuration和XML的方式启动

 
阅读更多

虽然 2.0 版本发布以来,Spring 陆续提供了十多个注解,但是提供的这些注解只是为了在某些情况下简化 XML 的配置,并非要取代 XML 配置方式。这一点可以从 Spring IoC 容器的初始化类可以看出:ApplicationContext 接口的最常用的实现类是 ClassPathXmlApplicationContext 和 FileSystemXmlApplicationContext,以及面向 Portlet 的 XmlPortletApplicationContext 和面向 web 的 XmlWebApplicationContext,它们都是面向 XML 的。Spring 3.0 新增了另外两个实现类:AnnotationConfigApplicationContext 和 AnnotationConfigWebApplicationContext。从名字便可以看出,它们是为注解而生,直接依赖于注解作为容器配置信息来 源的 IoC 容器初始化类。由于 AnnotationConfigWebApplicationContext 是 AnnotationConfigApplicationContext 的 web 版本,其用法与后者相比几乎没有什么差别,因此本文将以 AnnotationConfigApplicationContext 为例进行讲解。 
AnnotationConfigApplicationContext 搭配上 @Configuration 和 @Bean 注解,自此,XML 配置方式不再是 Spring IoC 容器的唯一配置方式。两者在一定范围内存在着竞争的关系,但是它们在大多数情况下还是相互协作的关系,两者的结合使得 Spring IoC 容器的配置更简单,更强大。 
之前,我们将配置信息集中写在 XML 中,如今使用注解,配置信息的载体由 XML 文件转移到了 Java 类中。我们通常将用于存放配置信息的类的类名以 “Config” 结尾,比如 AppDaoConfig.java、AppServiceConfig.java 等等。我们需要在用于指定配置信息的类上加上 @Configuration 注解,以明确指出该类是 Bean 配置的信息源。并且 Spring 对标注 Configuration 的类有如下要求: 
配置类不能是 final 的;配置类不能是本地化的,亦即不能将配置类定义在其他类的方法内部;配置类必须有一个无参构造函数。 AnnotationConfigApplicationContext 将配置类中标注了 @Bean 的方法的返回值识别为 Spring Bean,并注册到容器中,受 IoC 容器管理。@Bean 的作用等价于 XML 配置中的 标签。示例如下: 
@Configuration 
public class BookStoreDaoConfig{ 
@Bean 
public UserDao userDao(){ return new UserDaoImpl();} 
@Bean 
public BookDao bookDao(){return new BookDaoImpl();} 

Spring 在解析到以上文件时,将识别出标注 @Bean 的所有方法,执行之,并将方法的返回值 ( 这里是 UserDaoImpl 和 BookDaoImpl 对象 ) 注册到 IoC 容器中。默认情况下,Bean 的名字即为方法名。因此,与以上配置等价的 XML 配置如下:


@Bean 具有以下四个属性: 
name -- 指定一个或者多个 Bean 的名字。这等价于 XML 配置中 的 name 属性。initMethod -- 容器在初始化完 Bean 之后,会调用该属性指定的方法。这等价于 XML 配置中 的 init-method 属性。destroyMethod -- 该属性与 initMethod 功能相似,在容器销毁 Bean 之前,会调用该属性指定的方法。这等价于 XML 配置中 的 destroy-method 属性。autowire -- 指定 Bean 属性的自动装配策略,取值是 Autowire 类型的三个静态属性。Autowire.BY_NAME,Autowire.BY_TYPE,Autowire.NO。与 XML 配置中的 autowire 属性的取值相比,这里少了 constructor,这是因为 constructor 在这里已经没有意义了。@Bean 没有直接提供指定作用域的属性,可以通过 @Scope 来实现该功能,关于 @Scope 的用法已在上文列举。 
下面讲解基于注解的容器初始化。AnnotationConfigApplicationContext 提供了三个构造函数用于初始化容器。 
AnnotationConfigApplicationContext():该构造函数初始化一个空容器,容器不包含任何 Bean 信息,需要在稍后通过调用其 register() 方法注册配置类,并调用 refresh() 方法刷新容器。AnnotationConfigApplicationContext(Class... annotatedClasses):这是最常用的构造函数,通过将涉及到的配置类传递给该构造函数,以实现将相应配置类中的 Bean 自动注册到容器中。AnnotationConfigApplicationContext(String... basePackages):该构造函数会自动扫描以给定的包及其子包下的所有类,并自动识别所有的 Spring Bean,将其注册到容器中。它不但识别标注 @Configuration 的配置类并正确解析,而且同样能识别使用 @Repository、@Service、@Controller、@Component 标注的类。除了使用上面第三种类型的构造函数让容器自动扫描 Bean 的配置信息以外,AnnotationConfigApplicationContext 还提供了 scan() 方法,其功能与上面也类似,该方法主要用在容器初始化之后动态增加 Bean 至容器中。调用了该方法以后,通常需要立即手动调用 refresh() 刷新容器,以让变更立即生效。 
需要注意的是,AnnotationConfigApplicationContext 在解析配置类时,会将配置类自身注册为一个 Bean,因为 @Configuration 注解本身定义时被 @Component 标注了。因此可以说,一个 @Configuration 同时也是一个 @Component。大多数情况下,开发者用不到该 Bean,并且在理想情况下,该 Bean 应该是对开发者透明的。@Configuration 的定义如下所示: 
@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Component 
public @interface Configuration { 
String value() default ""; 

在一般的项目中,为了结构清晰,通常会根据软件的模块或者结构定义多个 XML 配置文件,然后再定义一个入口的配置文件,该文件使用 将其他的配置文件组织起来。最后只需将该文件传给 ClassPathXmlApplicationContext 的构造函数即可。针对基于注解的配置,Spring 也提供了类似的功能,只需定义一个入口配置类,并在该类上使用 @Import 注解引入其他的配置类即可,最后只需要将该入口类传递给 AnnotationConfigApplicationContext。具体示例如下: 
@Configuration 
@Import({BookStoreServiceConfig.class,BookStoreDaoConfig.class}) 
public class BookStoreConfig{ … } 
混合使用 XML 与注解进行 Bean 的配置 
设计 @Configuration 和 @Bean 的初衷,并不是为了完全取代 XML,而是为了在 XML 之外多一种可行的选择。由于 Spring 自发布以来,Spring 开发小组便不断简化 XML 配置,使得 XML 配置方式已经非常成熟,加上 Spring 2.0 以后出现了一系列命名空间的支持,使得 XML 配置方式成为了使用简单、功能强大的 Bean 定义方式。而且,XML 配置的一些高级功能目前还没有相关注解能够直接支持。因此,在目前的多数项目中,要么使用纯粹的 XML 配置方式进行 Bean 的配置,要么使用以注解为主,XML 为辅的配置方式进行 Bean 的配置。 
之所以会出现两者共存的情况,主要归结为三个原因:其一,目前绝大多数采用 Spring 进行开发的项目,几乎都是基于 XML 配置方式的,Spring 在引入注解的同时,必须保证注解能够与 XML 和谐共存,这是前提;其二,由于注解引入较晚,因此功能也没有发展多年的 XML 强大,因此,对于复杂的配置,注解还很难独当一面,在一段时间内仍然需要 XML 的配合才能解决问题。除此之外,Spring 的 Bean 的配置方式与 Spring 核心模块之间是解耦的,因此,改变配置方式对 Spring 的框架自身是透明的。Spring 可以通过使用 Bean 后处理器 (BeanPostProcessor) 非常方便的增加对于注解的支持。这在技术实现上非常容易的事情。 
要使用混合配置方式,首先需要判断以哪一种配置方式为主。对这个问题的不同回答将会直接影响到实现的方式。然而大可不必为此伤脑筋,因为 不论是以 XML 为主,还是以注解为主,配置方式都是简单而且容易理解的。这里不存在错误的决定,因为仅仅是表现方式不一样。我们首先假设以 XML 配置为主的情况。 
对于已经存在的大型项目,可能初期是以 XML 进行 Bean 配置的,后续逐渐加入了注解的支持,这时我们只需在 XML 配置文件中将被 @Configuration 标注的类定义为普通的 ,同时注册处理注解的 Bean 后处理器即可。示例如下: 
// 假设存在如下的 @Configuration 类: 
package bookstore.config; 
import bookstore.dao.*; 
@Configuration 
public class MyConfig{ 
@Bean 
public UserDao userDao(){ 
return new UserDaoImpl(); 


此时,只需在 XML 中作如下声明即可: 

…… 



由于启用了针对注解的 Bean 后处理器,因此在 ApplicationContext 解析到 MyConfig 类时,会发现该类标注了 @Configuration 注解,随后便会处理该类中标注 @Bean 的方法,将这些方法的返回值注册为容器总的 Bean。 
对于以上的方式,如果存在多个标注了 @Configuration 的类,则需要在 XML 文件中逐一列出。另一种方式是使用前面提到的自动扫描功能,配置如下: 

如此,Spring 将扫描所有 demo.config 包及其子包中的类,识别所有标记了 @Component、@Controller、@Service、@Repository 注解的类,由于 @Configuration 注解本身也用 @Component 标注了,Spring 将能够识别出 @Configuration 标注类并正确解析之。 
对于以注解为中心的配置方式,只需使用 @ImportResource 注解引入存在的 XML 即可,如下所示: 
@Configuration 
@ImportResource(“classpath:/bookstore/config/spring-beans.xml”) 
public class MyConfig{ 
…… 

// 容器的初始化过程和纯粹的以配置为中心的方式一致: 
AnnotationConfigApplicationContext ctx = 
new AnnotationConfigApplicationContext(MyConfig.class); 
…… 

 

转载自:http://www.tuicool.com/articles/M3MVr2

分享到:
评论

相关推荐

    @Configuration和@Bean的用法和理解.docx

    相比于传统的XML配置方式,这种方式更加灵活和简洁,同时也更容易理解和维护。此外,结合其他注解如`@ComponentScan`等,可以让整个应用的配置更加自动化和高效。 在实际开发过程中,了解和掌握这些注解的使用方法...

    spring4.0 Configuration的使用.docx

    - **实现方式**:除了使用 **@Configuration** 来启动 Spring 容器之外,还可以在配置类中定义带有 **@Bean** 注解的方法,用于创建并注册具体的 Bean 实例。 - **示例代码**: ```java package ...

    Spring @Configuration注解及配置方法

    本文主要介绍了Spring框架中的@Configuration注解及配置方法,以便读者对其有更深入的理解和掌握。 一、@Configuration注解的概念和作用 @Configuration注解是Spring框架中的一种注解,用于定义配置类,替换传统的...

    spring无web.xml零配置

    总结来说,"spring无web.xml零配置"意味着使用Java配置和Spring Boot的自动配置机制,替代了传统的XML配置方式,使得Spring应用的配置更加简洁、直观,同时也增强了可测试性和可维护性。通过这种方式,开发者可以更...

    SpringMVC基于代码的配置方式(零配置,无web.xml)

    传统的SpringMVC配置往往依赖于XML文件,如web.xml和spring-servlet.xml等,但随着Spring框架的发展,出现了基于代码的配置方式,实现了零XML配置,提高了开发效率。本文将详细介绍如何在不使用web.xml的情况下,...

    spring xml 定时任务

    在Spring框架中,XML配置是传统且广泛使用的方式来设置应用的组件和行为,包括实现定时任务。定时任务在软件开发中扮演着重要角色,它允许应用程序在预设的时间执行特定的任务,例如数据清理、日志归档或者发送通知...

    Spring @compenent注解详解

    - 如果一个类没有特定的业务角色,只是作为通用工具类,那么可能不需要`@Component`,而是使用`@Configuration`类或XML配置来创建Bean。 3. **派生注解** - `@Service`:通常用于业务逻辑层(Service Layer),它...

    示例代码:spring使用【@ImportResource】导入一个xml里面定义的bean

    总的来说,`@ImportResource`是Spring框架中连接Java配置和XML配置的桥梁,它使得我们能够在Spring Cloud项目中灵活地管理和使用XML配置文件,这对于处理一些特定场景或与遗留系统集成时非常有帮助。同时,通过结合...

    Spring中 Configuration的使用.docx

    @Configuration 和 @Bean 注解是 Spring 中非常重要的部分,它们提供了声明式配置的能力,使得我们可以用 Java 代码替代 XML 配置来管理 Bean。通过这种方式,我们可以更灵活地控制 Bean 的创建、初始化和装配,同时...

    spring + redis使用@Cacheable,@CachePut,@CacheEvict

    本篇文章将深入探讨如何使用Spring与Redis集成,并详细解释`@Cacheable`、`@CachePut`和`@CacheEvict`这三个关键的注解,它们是Spring缓存管理的核心组件。 首先,我们需要在项目中引入Spring Data Redis库,它提供...

    Spring全注解project示例 (无web.xml配置)

    但在Spring Boot应用中,尤其是使用Spring MVC时,可以借助`@SpringBootApplication`注解启动Spring Boot的自动配置功能,从而避免web.xml。Spring Boot的主类通常包含`@SpringBootApplication`,它综合了`@...

    自定义@Configuration配置类启用开关.zip

    在Spring Boot框架中,`@Configuration`注解是核心组件之一,它用于标记一个类作为配置类,使得我们可以使用Java配置来替代XML配置。在这个"自定义@Configuration配置类启用开关.zip"项目中,我们很显然会看到如何...

    spring和Mybatis的xml配置文件提示约束包

    "spring和Mybatis的xml配置文件提示约束包"这个主题,主要是关于在XML配置文件中使用的DTD(Document Type Definition)文档类型定义,它为XML文件提供了结构约束和语法规范。 DTD是一种元语言,用于定义XML文档的...

    自定义@Configuration配置类启用开关第二个版本.zip

    在Spring Boot应用中,`@Configuration`注解用于标记一个类作为配置类,它提供了声明式的方式来装配Bean。在标题提到的“自定义@Configuration配置类启用开关第二个版本.zip”中,我们可以推测这是一个关于如何在...

    Spring中基于Java的配置@Configuration和@Bean用法详解

    在Spring框架中,Java配置是替代传统XML配置的方式,它使得代码更加简洁且易于测试。`@Configuration`和`@Bean`是实现Java配置的核心注解。本文将深入讲解这两个注解的用法以及如何在Spring中使用它们来管理Bean。 ...

    spring中service生命周期(xml/annotation)

    此外,Spring还提供了基于Java的配置方式,通过@Configuration和@Bean注解来代替XML配置。例如: ```java @Configuration public class AppConfig { @Bean public MyService myService() { MyServiceImpl ...

    SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(下)

    如果默认的Converter不能满足需求,可以自定义实现HttpMessageConverter接口,然后通过`@Configuration`类和`WebMvcConfigurer`接口的`extendMessageConverters`方法添加到Spring MVC配置中。 ### 2. @ResponseBody...

    spring Configurable注解用法

    在Spring框架中,`@Configurable`注解是Spring AOP(面向切面编程)的一部分,主要用于实现依赖注入(DI)到非Spring...在Spring Boot项目中,正确配置和使用`@Configurable`可以有效地提高代码的灵活性和可维护性。

    springDemo.zip

    在Spring框架中,`@Configuration`、`@Bean` 和 `@ComponentScan` 是三个非常重要的注解,它们是Spring应用程序上下文(ApplicationContext)配置的核心元素。这些注解的使用对于理解和构建基于Java配置的Spring应用...

    让Hibernate同时支持xml和注解两种映射方式

    但有时候,根据项目需求,可能需要同时使用XML和注解映射。在这种情况下,我们需要进行一些特殊配置来实现这一目标。 首先,让我们理解Spring框架如何与Hibernate集成。Spring提供了`LocalSessionFactoryBean`用于...

Global site tag (gtag.js) - Google Analytics