• 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的缘故

  • 相关阅读:
    .ds_store是什么文件
    style="background-image: url(__HOMEPAGE__/views/IMJ2V2/images/banner2.jpg)"
    前段实现图片懒加载
    thinkphp路由的作用
    thinkphp跨模块调用
    关于肥胖和美国为什么那么多胖子
    php中局部变量和全局变量
    thinkphp5项目--企业单车网站(七)
    thinkphp5项目--企业单车网站(六)
    XSS攻击及防御
  • 原文地址:https://www.cnblogs.com/exe19/p/5398282.html
Copyright © 2020-2023  润新知