`
guoyiqi
  • 浏览: 1009622 次
社区版块
存档分类
最新评论

spring3 混合使用 XML 与注解(Annotation)进行 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>,同时注册处理注解的 Bean 后处理器即可。示例如下:

 // 假设存在如下的 @Configuration 类:
 package bookstore.config; 
 import bookstore.dao.*; 
 @Configuration 
 public class MyConfig{ 
 @Bean 
    public UserDao userDao(){ 
        return new UserDaoImpl(); 
    } 
 } 
此时,只需在 XML 中作如下声明即可:
 <beans … > 
    ……
    <context:annotation-config /> 
    <bean class=”demo.config.MyConfig”/> 
 </beans> 

 

由于启用了针对注解的 Bean 后处理器,因此在 ApplicationContext 解析到 MyConfig 类时,会发现该类标注了 @Configuration 注解,随后便会处理该类中标注 @Bean 的方法,将这些方法的返回值注册为容器总的 Bean。

对于以上的方式,如果存在多个标注了 @Configuration 的类,则需要在 XML 文件中逐一列出。另一种方式是使用前面提到的自动扫描功能,配置如下:

 <context:component-scan base-package=”bookstore.config” /> 

 

如此,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); 
……

 

 

@Configuration的使用

AppConfig.javapackage com.web.spring.other;

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*:spring/spring-properties.xml")
public class AppConfig {
    private @Value("${jdbc.driverClassName}") String driverClassName;
    @Bean(initMethod = "init")
    public JDBCBean jdbc(){
        JDBCBean jdbc=new JDBCBean();
        jdbc.setDriverClassName(driverClassName);
        return jdbc;
    }

}

 

<?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-3.0.xsd  
            http://www.springframework.org/schema/context  
            http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <context:annotation-config/>
    <!-- picks up and registers AppConfig as a bean definition -->
    <context:component-scan base-package="com.web.spring.other" />
    <context:property-placeholder location="classpath:jdbc.properties" />
    <bean class="com.web.spring.other.AppConfig"/>
</beans>



 

使用@Configuration注解需要依赖CGLIB的JAR包
否则异常

Exception in thread "main" java.lang.IllegalStateException: CGLIB is required to process @Configuration classes. 
Either add CGLIB to the classpath or remove the following @Configuration bean definitions: [spring3HelloWorldConfig]

at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:257)

at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:147)

at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:624)

at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:614)

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:398)

at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:65)

at net.roseindia.Spring3HelloWorldConfigTest.main(Spring3HelloWorldConfigTest.java:9)

 

分享到:
评论

相关推荐

    自定义注解得使用,模拟spring通过注解方式创建bean实例

    Spring的注解功能极大地简化了配置,使得开发者可以更专注于业务逻辑。本篇将深入探讨如何自定义注解并模拟Spring通过注解方式创建bean实例。 首先,了解注解(Annotation)在Java中的角色。注解是一种元数据,它...

    Dwr3+Spring3 全注解 annotation 方式

    当Dwr3与Spring3结合时,我们可以利用Spring的注解来管理DWR的配置。在Spring3中,可以通过`@Controller`注解来标识一个类作为处理HTTP请求的控制器,而DWR的`@RemoteProxy`注解可以用于标记那些需要在客户端直接...

    配置整合DWR3.0和Spring2.5使用annotation注解

    在本文中,我们将探讨如何将Direct Web Remoting (DWR) 3.0与Spring 2.5框架整合,并利用注解(Annotation)进行配置。DWR是一个允许JavaScript与Java服务器端进行交互的库,而Spring 2.5引入了对注解的强大支持,...

    spring事务,xml方式和注解方式

    本节将详细介绍Spring如何通过XML配置和注解方式来实现事务管理。 首先,我们来看Spring事务的XML配置方式。在Spring中,事务管理通常通过`&lt;tx:annotation-driven&gt;`和`&lt;bean&gt;`标签来实现。`&lt;tx:annotation-driven&gt;`...

    spring annotation注解

    第二种实现中,Spring 会将 userDao 这个成员变量的 setter 方法与 userDao bean 进行绑定。 2. @Autowired 注解的使用 @Autowired 注解可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。例如: ...

    Spring demo 自动检测注解

    当我们在类的属性或方法上使用这个注解时,Spring会自动寻找匹配类型的bean并将其注入。这种方式比传统的XML配置更为便捷,因为它减少了手动编写配置文件的负担。 自动检测注解的工作机制基于以下几点: 1. **类型...

    JavaEE 使用注解配置Bean的一个示例

    在JavaEE开发中,注解(Annotation)已经成为了一种强大的工具,它允许开发者在代码中嵌入元数据,简化了传统的XML配置方式。本示例将深入探讨如何使用注解来配置Bean,使得应用程序的配置更加简洁、直观。 首先,...

    扩展Spring—使用Annotation将配置资源注入到Bean中

    Spring Boot简化了Spring应用的启动和配置,它默认集成了许多常用功能,并且鼓励使用注解进行配置。例如,`@SpringBootApplication`是多个注解的组合,包括`@SpringBootConfiguration`、`@EnableAutoConfiguration`...

    Spring的Annotation配置相关讲义

    在Spring框架中,Annotation配置是一种简洁且强大的方式来管理Bean的定义和依赖注入,它消除了传统的XML配置文件,使得代码更加简洁、易读。在Spring 3.0及以上版本中,Annotation配置得到了广泛的应用。 首先,...

    csh框架+cxf+spring+hibernate+mysql 注解 annotation xml json

    【标题】"csh框架+cxf+spring+hibernate+mysql 注解 annotation xml json" 提到的是一个基于Java技术栈的Web服务开发架构,涵盖了多个关键组件和技术,这些技术在现代企业级应用中广泛应用。以下是这些知识点的详细...

    spring中自定义注解(annotation)与AOP中获取注解

    在Spring框架中,自定义注解(Annotation)和AOP(面向切面编程)的结合使用,极大地增强了代码的可读性和可维护性。本文将深入探讨如何在Spring中创建自定义注解以及如何在AOP中有效地获取并利用这些注解。 首先,...

    IOC之基于注解的配置bean(下)

    使用`@Autowired`注解,Spring会自动寻找与目标类型匹配的bean进行注入。如果需要指定注入的bean,可以使用`@Qualifier`。 ```java @Service public class UserService { @Autowired private UserRepository ...

    Struts2+Hibernate4+Spring3整合(注解和XML方式都有)

    Spring3同样支持使用注解进行组件扫描,自动发现和配置bean。 在导入项目时,需要注意修改数据库连接信息。通常在Hibernate的配置文件(hibernate.cfg.xml)中,你需要更新`&lt;property name="connection.url"&gt;`等...

    如何完成spring的最小化XML配置

    Spring框架的XML配置是其核心特性之一,它允许开发者声明Bean的定义,管理依赖关系以及配置其他服务。然而,随着框架的发展,为了简化配置,Spring引入了最小化XML配置的概念,以及注解装配的方式,使得配置更加简洁...

    spring 定时器 注解+xml 方式模板

    Spring Schedule模块提供了强大的定时任务支持,既可以通过注解的方式,也可以通过XML配置来实现。本文将深入探讨如何使用`@Scheduled`注解和XML配置来创建和管理定时任务。 首先,我们要引入Spring Schedule的依赖...

    Spring Annotation简介一

    3. **配置类(Configuration Class)**:`@Configuration`注解标记的类可以替代XML配置文件,通过`@Bean`注解定义bean的创建过程。`@Bean`注解的方法会返回一个对象,该对象会被Spring容器管理。 4. **条件注解...

    学习Spring笔记_Annotation(注解)_Component

    4. **注解配置与XML配置的对比**:Spring框架既支持XML配置也支持注解配置。XML配置方式直观,但代码量大,维护困难;注解配置简洁,减少了XML配置文件,使代码更加清晰,同时提高了可读性和可维护性。然而,对于...

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

    然而,默认情况下,一个项目只能选择其中一种方式进行配置。但有时候,根据项目需求,可能需要同时使用XML和注解映射。在这种情况下,我们需要进行一些特殊配置来实现这一目标。 首先,让我们理解Spring框架如何与...

    Spring Annotation (注解)详解

    5. **传统XML配置与注解配置** - 在没有注解之前,我们需要在XML配置文件中显式定义Bean及它们的依赖。例如,`beans.xml`文件中,我们需要声明每个Bean以及它们之间的依赖关系。而使用注解后,这些配置可以直接写在...

Global site tag (gtag.js) - Google Analytics