Spring注解式与配置文件式

 http://tom-seed.iteye.com/blog/1584632

Spring注解方式bean容器管理

1.通过在配置文件中配置spring组件注入

Xml代码  收藏代码
  1. <context:component-scan base-package="com"/><!---通过该语句可以搜索com及com下子包中的类->  
  2. <mvc:annotation-driven/>  

2.为Spring编写简单bean类,一般对应接口与具体实现类

例如:

a.在com包下建立如下接口:HessianHelloWorld

b.com.impl包下新建如下实现类:HessianHelloWorldImpl

3.在此处使用注解形式进行来支持bean的管理

   在具体需要托管的bean的类名上添加注解:@Controller

   完整代码如下:

Java代码  收藏代码
  1. @Controller  
  2. public class HessianHelloWorldImpl implements HessianHelloWorld{}  

4.在业务类中调用上面的托管bean,以动态代理的形式引入;

    private HessianHelloWorld hello;

    并在属性上添加注解

    @Autowired

    完整代码如下:

Java代码  收藏代码
  1. @Autowired  
  2. private HessianHelloWorld hello;  

注解方式结束

Spring配置文件形式:

1.去除上面的所有注解

   在Spring配置文件中添加类的配置

Xml代码  收藏代码
  1. <bean id="hessianHelloWorldImpl" class="com.impl.HessianHelloWorldImpl"></bean>  

2.在Spring配置文件中添加业务类的配置

   业务类名为Test,在业务类中配置属性(helloworld)及属性指向托管bean的id,其中属性helloworld在业务类中命名必须一致,且有该属性的get/set方法

Xml代码  收藏代码
  1. <bean id="test" class="com.test.Test">  
  2.         <property name="helloWorld" ref="hessianHelloWorldImpl"></property>  
  3. </bean>  

3.在Test.java中添加

   private HessianHelloWorld helloWorld;

   与get/set方法

Java代码  收藏代码
  1. private HessianHelloWorld helloWorld;  
  2.   
  3. public HessianHelloWorld getHelloWorld() {  
  4.         return helloWorld;  
  5. }  
  6.   
  7. public void setHelloWorld(HessianHelloWorld helloWorld) {  
  8.         this.helloWorld = helloWorld;  
  9. }  

配置文件方式结束

注意事项

在此过程中需要注意注解方式与配置文件配置方式混合使用(由于业务需求的不同,例如注解方式的情况下使用定时器时就存在混合使用的情况)时的命名规范,当使用注解方式时bean在spring bean容器中的id首字母小写的类全名,而通过配置文件配置时id为自定义。

如下实例为同时使用了注解方式与配置方式:

1.在spring配置文件中添加如下配置:

Xml代码  收藏代码
  1. <bean id="helloWorld" class="com.impl.HessianHelloWorldImpl" />  

2.在托管bean(HessianHelloWorldImpl)上添加注解

Java代码  收藏代码
  1. @Controller  
  2. public class HessianHelloWorldImpl implements HessianHelloWorld{}  

这样HessianHelloWorldImpl在Spring的bean容器中注册了两个实例。即(helloWorld与hessianHelloWorldImpl)

3.在业务类(调用类)的属性上添加标注,即不通过在配置文件中配置hello对应的类,而通过标签自动匹配。

Java代码  收藏代码
  1. @Autowired  
  2. private HessianHelloWorld hello;  

启动时会报

Java代码  收藏代码
  1. nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:   
  2. No unique bean of type [com.HessianHelloWorld] is defined:   
  3. expected single matching bean but found 2: [helloWorld, hessianHelloWorldImpl]  

由于此处的指针名为hello,通过自动匹配的方式无法确认具体需要用到哪个实例

在混用的情况下需要对bean实例的命名与bean的名称管理。

上述情况不使用@Controller,直接在配置文件中注册bean(bean的id不为hello),即一个bean在配置文件中注册了两次。

Xml代码  收藏代码
  1. <bean id="hessianHelloWorldImpl" class="com.remote.impl.HessianHelloWorldImpl"></bean>  

也会出现同样的效果。

如果必须使用混用,可以在业务类(调用类)的属性名与bean容器中的名称相同

Java代码  收藏代码
  1. @Autowired  
  2. private HessianHelloWorld helloWorld;  

或者去除@Autowired直接在spring的bean配置文件中指定业务类属性对应的实例名称

Xml代码  收藏代码
  1. <bean id="test" class="com.test.Test">  
  2.         <property name="hello" ref="hessianHelloWorldImpl"></property>  
  3. </bean>  

常见错误:

通过配置文件配置bean的使用时

项目启动时报错:

Java代码  收藏代码
  1. Cannot resolve reference to bean 'hessianHelloWorldImpl' while setting bean property 'hello';   
  2. nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:   
  3. No bean named 'hessianHelloWorldImpl' is defined  

 spring找不到该类名,需要检查spring配置文件中bean的配置,若使用标注的则需要检查

<context:component-scan base-package="com"/>
<mvc:annotation-driven/>

是否已经添加

当业务调用类中使用标签时(@Autowired),可能在启动时不会报错,但是调用时会出现空指针异常,也可能是因为和上面的情况一样未指定bean的缘故

原文地址:https://www.cnblogs.com/exe19/p/5398282.html