http://tom-seed.iteye.com/blog/1584632
Spring注解方式bean容器管理
1.通过在配置文件中配置spring组件注入
Xml代码
- <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
完整代码如下:
Java代码
- @Controller
- public class HessianHelloWorldImpl implements HessianHelloWorld{}
4.在业务类中调用上面的托管bean,以动态代理的形式引入;
private HessianHelloWorld hello;
并在属性上添加注解
@Autowired
完整代码如下:
Java代码
- @Autowired
- private HessianHelloWorld hello;
注解方式结束
Spring配置文件形式:
1.去除上面的所有注解
在Spring配置文件中添加类的配置
Xml代码
- <bean id="hessianHelloWorldImpl" class="com.impl.HessianHelloWorldImpl"></bean>
2.在Spring配置文件中添加业务类的配置
业务类名为Test,在业务类中配置属性(helloworld)及属性指向托管bean的id,其中属性helloworld在业务类中命名必须一致,且有该属性的get/set方法
Xml代码
- <bean id="test" class="com.test.Test">
- <property name="helloWorld" ref="hessianHelloWorldImpl"></property>
- </bean>
3.在Test.java中添加
private HessianHelloWorld helloWorld;
与get/set方法
Java代码
- private HessianHelloWorld helloWorld;
- public HessianHelloWorld getHelloWorld() {
- return helloWorld;
- }
- public void setHelloWorld(HessianHelloWorld helloWorld) {
- this.helloWorld = helloWorld;
- }
配置文件方式结束
注意事项
在此过程中需要注意注解方式与配置文件配置方式混合使用(由于业务需求的不同,例如注解方式的情况下使用定时器时就存在混合使用的情况)时的命名规范,当使用注解方式时bean在spring bean容器中的id首字母小写的类全名,而通过配置文件配置时id为自定义。
如下实例为同时使用了注解方式与配置方式:
1.在spring配置文件中添加如下配置:
Xml代码
- <bean id="helloWorld" class="com.impl.HessianHelloWorldImpl" />
2.在托管bean(HessianHelloWorldImpl)上添加注解
Java代码
- @Controller
- public class HessianHelloWorldImpl implements HessianHelloWorld{}
这样HessianHelloWorldImpl在Spring的bean容器中注册了两个实例。即(helloWorld与hessianHelloWorldImpl)
3.在业务类(调用类)的属性上添加标注,即不通过在配置文件中配置hello对应的类,而通过标签自动匹配。
Java代码
- @Autowired
- private HessianHelloWorld hello;
启动时会报
Java代码
- 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在配置文件中注册了两次。
Xml代码
- <bean id="hessianHelloWorldImpl" class="com.remote.impl.HessianHelloWorldImpl"></bean>
也会出现同样的效果。
如果必须使用混用,可以在业务类(调用类)的属性名与bean容器中的名称相同
Java代码
- @Autowired
- private HessianHelloWorld helloWorld;
或者去除@Autowired直接在spring的bean配置文件中指定业务类属性对应的实例名称
Xml代码
- <bean id="test" class="com.test.Test">
- <property name="hello" ref="hessianHelloWorldImpl"></property>
- </bean>
常见错误:
通过配置文件配置bean的使用时
项目启动时报错:
Java代码
- 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的缘故