spring3 混合使用 XML 与注解(Annotation)进行 Bean 的配置

【Spring源码】3. xml文件如何转换成BeanDefinition(主要涉及prepareRefresh()+ obtainFreshBeanFactory()两个函数,图解向,堆图预警) 一堆图预警~~~ 通过测试启动类进入ApplicationContext容器 设置(解析)配置文件路径 setConfigLocations(configLocations); 参数configLocations格式是String[] ​进入超级重要的refresh()方法 1.准备工作:prepareRefresh() /** * Prepare this context for refreshing, setting its startup date and 阅读详情

spring3 混合使用 XML 与注解(Annotation)进行 Bean 的配置

Posted on  2012-02-14 11:18  阳光VIP 阅读( 423) 评论( 0)  编辑  收藏

设计 @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的使用

Java代码   
  1. AppConfig.javapackage com.web.spring.other;   
  2.   
  3. import org.springframework.beans.factory.annotation.Value;   
  4. import org.springframework.context.annotation.Bean;   
  5. import org.springframework.context.annotation.Configuration;   
  6. import org.springframework.context.annotation.ImportResource;   
  7.   
  8. @Configuration  
  9. @ImportResource("classpath*:spring/spring-properties.xml")   
  10. public class AppConfig {   
  11.     private @Value("${jdbc.driverClassName}") String driverClassName;   
  12.     @Bean(initMethod = "init")   
  13.     public JDBCBean jdbc(){   
  14.         JDBCBean jdbc=new JDBCBean();   
  15.         jdbc.setDriverClassName(driverClassName);   
  16.         return jdbc;   
  17.     }   
  18.   
  19. }  
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代码   
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans      
  5.             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
  6.             http://www.springframework.org/schema/context     
  7.             http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
  8.     <context:annotation-config/>  
  9.     <!-- picks up and registers AppConfig as a bean definition -->  
  10.     <context:component-scan base-package="com.web.spring.other" />  
  11.     <context:property-placeholder location="classpath:jdbc.properties" />  
  12.     <bean class="com.web.spring.other.AppConfig"/>  
  13. </beans>  
<?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包
否则异常

Java代码   
  1. Exception in thread "main" java.lang.IllegalStateException: CGLIB is required to process @Configuration classes.    
  2. Either add CGLIB to the classpath or remove the following @Configuration bean definitions: [spring3HelloWorldConfig]   
  3.   
  4. at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:257)   
  5.   
  6. at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:147)   
  7.   
  8. at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:624)   
  9.   
  10. at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:614)   
  11.   
  12. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:398)   
  13.   
  14. at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:65)   
  15.   
  16. at net.roseindia.Spring3HelloWorldConfigTest.main(Spring3HelloWorldConfigTest.java:9)  
SpringBoot从入门到精通(全) 前言 ==本博文结合软件idea进行主要讲解== **springboot的特性主要有** - 简化 Spring 应用程序的创建和开发过程 - 抛弃了繁琐的 xml 配置过程,采用大量的默认配置简化以及注解反射 - 直接使用 java main 方法启动内嵌的 Tomcat 服务器运行 Spring Boot 程序,不需要部署 war 包文件 **四大核心**分别为自动配置、起步依赖、Actuator和命令行界面 阅读详情

相关推荐

C#实战:基于ONNX与SCRFD/ArcFace的高效人脸识别系统开发

本文详细介绍了如何在C#环境中,利用ONNX Runtime高效部署SCRFD人脸检测与ArcFace人脸识别模型,构建一个完整的、高性能的人脸识别系统。内容涵盖环境搭建、模型推理、人脸对齐、特征提取等核心模块,并提供了从Demo到生产系统的优化思路与实战代码,为.NET开发者提供了一套开箱即用的解决方案。

weixin_29061821的博客 488

spring的xml配置与annotation注解混合使用无法Autowired的问题

问题: 在LVMMCrawlerSuit.java是xml配置的bean, 需要注入用@Component声明的bean. 但是运行的时候却报NullPointerException. 说明没有注入进来.   代码: 1. java Java代码   1. LVMMCrawlerSuit.java    public class LVMMCrawlerS...

fly0wings的专栏 824

在Matlab中开发AutoSAR模型的流程(自下而上)

前面介绍了AutoSAR软件组件开发的两种方式,其中自下向上的方式,是从模型出发,流程如下。

小胡同学的工程师学习之路 5367

在Spring中同时使用了Annotation配置和XML配置,spring优先使用哪一个

新近接触了SpringMVC3.0,从个人感觉来讲我非常喜欢。之所以从3.0版本才开始学习,也是对于旧版本的XML配置有所忌惮。SpringMVC从2.5版本引入了annotation,到了3.0有了进一步增强。 参考了文章[url]http://bulargy.iteye.com/blog/179781[/url]的一些观点,我也觉得有时候Annotation较之于XML-configu...

iteye_19759的博客 281

AD24层次原理图设计避坑指南:如何解决端口连接与自动交叉引用问题

本文深入解析AD24层次原理图设计的核心机制,聚焦端口连接错误、自动交叉引用干扰等常见问题。通过对比自上而下与自下而上设计流程,提供端口类型匹配、命名规范等实用解决方案,并指导如何关闭烦人的红色框线视觉干扰,帮助工程师高效避坑,实现复杂系统的模块化设计。

wdx01234567的博客 616

Android System Slice应用加载分析,及启用Slice后,锁屏日期第一次开机正常显示,但后面锁屏不显示问题分析

最近发现Android P上锁屏界面,日期不显示,发现从P开始后,出现了Slice来允许应用以模块化,可交互的方式,插入多个使用场景。Android P的system UI 也使用到了这一特性,表现为锁屏时间,日期,勿扰图标,闹钟等。 如何使用Slice 以System UI中KeyguardSliceView.java来说明它的使用方法 首先,我们打开System UI 的mk 文件,可以看到以...

qq_33595823的博客 3035

spring配置: Annotation vs XML

Spring注解及xml配置的选择

不忘初心,方得始终 1451

22、狭义相对论与曲线坐标空间相关知识解析

本文深入解析了狭义相对论与曲线坐标空间的核心概念,涵盖能量-动量张量的定义与守恒、曲线坐标系下的度量张量与基向量性质、协变与逆变张量的变换规则,并介绍了克里斯托费尔符号与协变导数的计算方法。进一步探讨了在弯曲空间中进行微积分运算的基础理论及其在广义相对论中的关键应用,如爱因斯坦场方程如何描述物质-能量对时空曲率的影响,为理解黑洞等引力现象提供了理论框架。

lambda的博客 116

spring 3.0注解完全取代XML文件

spring 3.0新注解,可以完全取代XML文件

yu的博客 1425

汽车信息安全--SHE中的密钥管理(二)

上一篇我们讲解了HTA基本概念,SHE和EVITA HSM区别以及SHE的架构,接下来我们聊一聊SHE中的密钥管理策略。

认真搞搞汽车MCU 2404

【四足机器人项目实战】四足机器人腿部机械结构设计

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对四足机器人–腿部机械结构设计做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 为了减轻腿部惯量,使用有限元分析着重进行轻量化设计,小腿采用工字梁方案,大腿采用内部镂方案,并使用1.5 mm的AL 6061硬质材料,轻量化的腿部设了腿部运动时摆动

qq_35635374的博客 7539

spring的xml配置与annotation注解混合

spring的xml配置与annotation注解混合使用无法Autowired的问题 问题: 在LVMMCrawlerSuit.java是xml配置的bean, 需要注入用@Component声明的bean. 但是运行的时候却报NullPointerException. 说明没有注入进来.   代码: 1. java Java代码   1. LV

wangshfa的专栏 1万+

SAP_SD模块-销售批次策略应用记录

SAP_SD模块-销售批次策略完整案例

风沙的博客 2611

详解 Spring 3.0 基于 Annotation 的依赖注入实现

<br />使用 @Repository、@Service、@Controller 和 @Component 将类标识为 Bean<br />Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发。@Repository 注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean。具体只需将该注解标注在 DAO 类上即可。同时,为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用

海阔天空 1704

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

spring中注解和xml混合使用

注解和xml混合使用 步骤: 1.将所有的bean都配置xml中        2.将所有的依赖都使用注解        @Autowired        默认不生效。为了生效,需要在xml配置:   总结: 注解1: 注解2: 1.一般情况两个注解不一起使用。 2. “注解1”扫描含有注解(@Component等)类,注入注解自动生效。        “注解2”只在

hongcaixia的博客 4715

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

备忘-使用annotation减少spring bean的配置

发现一篇好文 http://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/ 它给出了比本文更详细的说明。 springframework 2.5引入了完整的annotaion配置注解,使用这些annotation可以大量的减少bean的定义,也使得程序开发更简单和容易维护。 当然你要使用annotation就需要使用java5...

flex,javascript,php,dede,织梦 149

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Spring】使用注解(Annotation)进行开发

文章目录一、使用注解和xml组合开发环境配合applicationContext.xml:1.使用注解取代原本的中的实体类的注入2.属性的注入3.引用类型属性的注入4.衍生注解5.自动装配6.作用域注意测试二、完全使用注解开发1. 使用JavaConfig实现配置2. 将多个“@Configuration类”融合在一起测试 一、使用注解和xml组合开发 环境配合applicationContext.xml: <?xml version="1.0" encoding="UTF-8"?> <b

✈ 正在努力 の 寒江(StudiousTiger) ✌ 呐 ✈ 311

XML和注解

实际开发中使用XML还是注解?XML:bean的管理注解:注入属性的时候比较方便两种方式的结合:一般使用XML注册bean,使用注解来进行属性注入。在applicationContext.xml中配置&lt;context:annotation-config&gt;&lt;/context:annotation-config&gt;举个简单的例子:新建3个bean:[java] view plai...

SANG 1905

Spring基础篇——通过Java注解和XML配置装配bean(转载)

作者:陈本布衣      出处:http://www.cnblogs.com/chenbenbuyi      本文版权归作者和博客园共有,欢迎转载分享,但必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。 博文目录 Java配置类装配bean XML配置文件装配bean 三种装配方式的混合使用 正文  ...

datai3890的博客 226

Spring中Annotation的简单介绍

本人在做项目时用到了Spring框架,

lyhmyway的专栏 878

spring中xml配置与annotation注解混合

 spring的xml配置与annotation注解混合使用无法Autowired的问题   问题: AppUserServiceImpl.java是通过@Service声明的bean,在xml配置文件中重新给AppUserServiceImpl.java配置一个别名“pap_appuser_service”。 在普通类AppUserAPIImpl.java中,需要调用AppUserS...

飞翔的天空 404

Spring使用篇(四)—— Spring中Bean的高级装配方式

文章目录1、装配的混合使用2、使用Profile3、加载属性文件4、条件华装配Bean5、Bean的作用域6、使用Spring表达式 1、装配的混合使用 2、使用Profile 3、加载属性文件 4、条件华装配Bean 5、Bean的作用域 6、使用Spring表达式 ...

王喆峰的博客 857

Spring MVC “XML配置bean”和“注解自动扫描bean”,两者混合使用,同时生效的配置方法

1,原来的工程里配置了bean=/xxx.do格式的controller,现在想要增加自动扫描,并使xml和注解的bean都可以生效 2,在dispatcherServlet所在的xml配置文件中(我这里是spring-mvc.xml),增加三行 &lt;context:annotation-config/&gt;  //启动注解,用来实现注入等 &lt;mvc:annotation-dri...

George Jiang - Daydreamer 4455

详解Spring3基于Annotation的依赖注入实现

原文 http://developer.51cto.com/art/201103/246592.htm 简介: Spring 的依赖配置方式与 Spring 框架的内核自身是松耦合设计的。然而,直到 Spring 3.0 以前,使用 XML 进行依赖配置几乎是唯一的选择。Spring 3.0 的出现改变了这一状况,它提供了一系列的针对依赖注入的注解,这使得 Spring IoC 在 X...

anpan6225的博客 125

关于spring中注解和xml混合使用

可以混合用。文档有说明: Spring can accommodate both styles and even mix them together. 混合用的话,有个先后顺序,xml配置会覆盖annotation。原文: Annotation injection is performedbeforeXML injection, thus the latter configuration...

weixin_30672295的博客 132
上一篇: Spring 基于注解 和 基于配置的一点问题?
下一篇: MySQL从MyISAM引擎转换到InnoDB引擎需要注意的地方
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值