Spring注解式与配置文件式
http://tom-seed.iteye.com/blog/1584632
Spring注解方式bean容器管理
1.通过在配置文件中配置spring组件注入
- <context:component-scan base-package="com"/><!---通过该语句可以搜索com及com下子包中的类->
- <mvc:annotation-driven/>
2.为Spring编写简单bean类,一般对应接口与具体实现类
例如:
a.在com包下建立如下接口:HessianHelloWorld
b.com.impl包下新建如下实现类:HessianHelloWorldImpl
3.在此处使用注解形式进行来支持bean的管理
在具体需要托管的bean的类名上添加注解:@Controller
完整代码如下:
- @Controller
- public class HessianHelloWorldImpl implements HessianHelloWorld{}
4.在业务类中调用上面的托管bean,以动态代理的形式引入;
private HessianHelloWorld hello;
并在属性上添加注解
@Autowired
完整代码如下:
- @Autowired
- private HessianHelloWorld hello;
注解方式结束
Spring配置文件形式:
1.去除上面的所有注解
在Spring配置文件中添加类的配置
- <bean id="hessianHelloWorldImpl" class="com.impl.HessianHelloWorldImpl"></bean>
2.在Spring配置文件中添加业务类的配置
业务类名为Test,在业务类中配置属性(helloworld)及属性指向托管bean的id,其中属性helloworld在业务类中命名必须一致,且有该属性的get/set方法
- <bean id="test" class="com.test.Test">
- <property name="helloWorld" ref="hessianHelloWorldImpl"></property>
- </bean>
3.在Test.java中添加
private HessianHelloWorld helloWorld;
与get/set方法
- private HessianHelloWorld helloWorld;
- public HessianHelloWorld getHelloWorld() {
- return helloWorld;
- }
- public void setHelloWorld(HessianHelloWorld helloWorld) {
- this.helloWorld = helloWorld;
- }
配置文件方式结束
注意事项
在此过程中需要注意注解方式与配置文件配置方式混合使用(由于业务需求的不同,例如注解方式的情况下使用定时器时就存在混合使用的情况)时的命名规范,当使用注解方式时bean在spring bean容器中的id首字母小写的类全名,而通过配置文件配置时id为自定义。
如下实例为同时使用了注解方式与配置方式:
1.在spring配置文件中添加如下配置:
- <bean id="helloWorld" class="com.impl.HessianHelloWorldImpl" />
2.在托管bean(HessianHelloWorldImpl)上添加注解
- @Controller
- public class HessianHelloWorldImpl implements HessianHelloWorld{}
这样HessianHelloWorldImpl在Spring的bean容器中注册了两个实例。即(helloWorld与hessianHelloWorldImpl)
3.在业务类(调用类)的属性上添加标注,即不通过在配置文件中配置hello对应的类,而通过标签自动匹配。
- @Autowired
- private HessianHelloWorld hello;
启动时会报
- nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
- No unique bean of type [com.HessianHelloWorld] is defined:
- expected single matching bean but found 2: [helloWorld, hessianHelloWorldImpl]
由于此处的指针名为hello,通过自动匹配的方式无法确认具体需要用到哪个实例
在混用的情况下需要对bean实例的命名与bean的名称管理。
上述情况不使用@Controller,直接在配置文件中注册bean(bean的id不为hello),即一个bean在配置文件中注册了两次。
- <bean id="hessianHelloWorldImpl" class="com.remote.impl.HessianHelloWorldImpl"></bean>
也会出现同样的效果。
如果必须使用混用,可以在业务类(调用类)的属性名与bean容器中的名称相同
- @Autowired
- private HessianHelloWorld helloWorld;
或者去除@Autowired直接在spring的bean配置文件中指定业务类属性对应的实例名称
- <bean id="test" class="com.test.Test">
- <property name="hello" ref="hessianHelloWorldImpl"></property>
- </bean>
常见错误:
通过配置文件配置bean的使用时
项目启动时报错:
- Cannot resolve reference to bean 'hessianHelloWorldImpl' while setting bean property 'hello';
- nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
- No bean named 'hessianHelloWorldImpl' is defined
spring找不到该类名,需要检查spring配置文件中bean的配置,若使用标注的则需要检查
<context:component-scan base-package="com"/>
<mvc:annotation-driven/>
是否已经添加
当业务调用类中使用标签时(@Autowired),可能在启动时不会报错,但是调用时会出现空指针异常,也可能是因为和上面的情况一样未指定bean的缘故
Spring注解式与配置文件式的更多相关文章
- Spring 注解方式引入配置文件
配置文件,我以两种为例,一种是引入Spring的XML文件,另外一种是.properties的键值对文件: 一.引入Spring XML的注解是@ImportResource @Retention(R ...
- spring注解注入properties配置文件
早期,如果需要通过spring读取properties文件中的配置信息,都需要在XML文件中配置文件读取方式. 基于XML的读取方式: <bean class="org.springf ...
- Spring注解式事务解析
#Spring注解式事务解析 增加一个Advisor 首先往Spring容器新增一个Advisor,BeanFactoryTransactionAttributeSourceAdvisor,它包含了T ...
- spring注解式参数校验
很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者返回异常时的校验信息,在代码中相当冗长,今天我们就来学习spring注解式参数校验. 其实就是:hibernate的validator. 开始啦. ...
- MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式
MVC的验证(模型注解和非侵入式脚本的结合使用) @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...
- hibernate3整合spring2时hibernate即用注解又用配置文件情况时spring配置文件的配置写法
hibernate只用注解时,spring的配置文件的配置如下 <bean id="dataSource" class="org.apache.commons.db ...
- Spring注解使用和与配置文件的关系
Spring注解使用和与配置文件的关系 1 注解概述与容器管理机制 Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repositor ...
- 【spring boot】使用注解@ConfigurationProperties读取配置文件时候 报错 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'rocketmqAutoConfiguration': Unsatisfied dependenc
如题,配置文件如下: #注册中心配置 eureka: instance: instanceId: ${spring.application.name}:${random.int} hostname: ...
- 【Spring注解驱动开发】使用@PropertySource加载配置文件,我只看这一篇!!
写在前面 很多小伙伴都在问:冰河,你的Spring专题更新完了吗?怎么感觉像是写了一半啊?我:没有更新完呀,整个专题预计会有70多篇.那怎么更新了一半就去写别的了呢?那是因为有很多其他的小伙伴在后台留 ...
随机推荐
- MySQL5.7 基于二进制包的安装
1.MySQL5.7安装注意事项 1.在MySQL5.7中mysql_install_db已经不再推荐使用,建议改成mysqld-initialize 完成实力初始化.(mysql_install_d ...
- gitlab创建项目代码:
cd (当前工程文件夹目录) git init //初始化git git remote add origin http://worker.njbandou.com/KLElevator/kle ...
- Service和Activity交互之广播方式
一.使用场景如果要通知多个Activity,广播较为适合.但广播较为耗费性能. 二.Broadcast更新Activity中的UI 1.新建一个接口OnUpdateUI,用于回调更新UI public ...
- css 中 important 的用法
css 中 important 的如何使用? important对 一个良好(或者是标准)的浏览器来说,不仅仅是从顺序上提升代码的优先级,还可以用来提升class的优先级(比如firefox), ...
- python 存取xml方法
或者也可以参考http://www.cnblogs.com/xiaowuyi/archive/2012/10/17/2727912.html中内容 目前而言,Python 3.2存取XML有以下四种方 ...
- 工作总结 1 sql写法 insert into select from 2 vs中 obj文件和bin文件 3 npoi 模板copy CopySheet 最好先全部Copy完后 再根据生成sheet写数据 4 sheet.CopyRow(rowsindex, rowsindex + x); 5 npoi 复制模板如果出现单元格显示问题
我们可以从一个表中复制所有的列插入到另一个已存在的表中: INSERT INTO table2SELECT * FROM table1; 或者我们可以只复制希望的列插入到另一个已存在的表中: INSE ...
- Https单向认证和双向认证介绍
一.Http HyperText Transfer Protocol,超文本传输协议,是互联网上使用最广泛的一种协议,所有WWW文件必须遵循的标准.HTTP协议传输的数据都是未加密的,也就是明文的,因 ...
- SQL Server 中树形表数据的处理总结
-- 使用函数的方法: --建立 演示环境 if object_id('tb_bookInfo') is not null drop table tb_bookInfo go ),type int) ...
- VM虚拟机内ubuntu无法连接到网络
VM虚拟机内ubuntu无法连接到网络 解决:编辑网络,将网路都删除掉.又一次加入网络桥接和NAT链接. .又一次连接就可以,查看一下ip地址. 方法2: 虚拟机中新装ubuntu 编辑虚拟网络,先恢 ...
- How to Use HTML5 FUll Screen API(怎样使用HTML5全屏接口)
原文链接:http://www.sitepoint.com/use-html5-full-screen-api/ 假设你不太喜欢变化太快的东西,那么web开发可能不适合你. 我曾在2012年末有写过F ...