`

Spring学习之从XML到注解(二.两者的对比)

阅读更多

 

一.XML配置文件形式:

1.在applicationContext.xml文件中配置bean

注意:业务类SayHello的property属性helloworld在业务类中命名必须一致,且有该属性的get/set方法

<bean id="helloWorldImpl" class="com.impl.HelloWorldImpl"></bean> 
<bean id="sayHello" class="com.say.SayHello">  
    <property name="helloWorld" ref="helloWorldImpl"></property>  
</bean>  

 2.在Test类中添加HelloWorld类的get/set方法——set注入

public class SayHello{  
    private HelloWorld helloWorld;  
      
    public HelloWorld getHelloWorld() {  
            return helloWorld;  
    }  
      
    public void setHelloWorld(HelloWorld helloWorld) {  
            this.helloWorld = helloWorld;  
    }  
}

 3.加载配置文件,获取bean

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                new String[] { "classpath:/applicationContext.xml" });
SayHello sayHello = applicationContext.getBean("sayHello");

 

.注解形式:

1.在配置文件中配置spring注解扫描

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

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

@Repository
public class HelloWorldImpl implements HelloWorld{}

 3.在业务类中调用上面的托管bean,并在属性上添加注解:@Autowired

public class SayHello{
    @Autowired  
    private HelloWorld hello;  
}

 

区别:

1.无须再在配置文件中配置一大堆的bean——(用@Controller/@Service/@Repository/@Component)

2.不用再在调用某个bean的业务类中写该bean的set/get方法——(用@Resource/@Autowired)

3.不用再继续通过加载配置文件后用getBean(“***”)方式来获取某个类的实例

 

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

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

    <bean id="hello" class="com.impl.HelloWorldImpl" />  

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

    @Repository
    public class HelloWorldImpl implements HelloWorld{}  

 这样HelloWorldImpl在Spring的bean容器中注册了两个实例。即(hello与helloWorldImpl) 3.在业务类的HelloWorld属性上添加标注:

    ——即不通过在配置文件中配置hello对应的类,而通过标签自动匹配

public class SayHello{
    @Autowired  
    private HelloWorld hello; //注意此处的属性名不是helloWorld,而是hello
}

 此时,运行后会报异常:

    nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:   
    No unique bean of type [com.HelloWorld] is defined:   
    expected single matching bean but found 2: [helloWorld, helloWorldImpl]  
 由于此处的指针名为hello,通过自动匹配的方式无法确认具体需要用到哪个实例(因为找到了两个!)

 

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

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

<bean id="helloWorldImpl" class="com.remote.impl.HelloWorldImpl"></bean>
 也会出现同样的效果。

 

 

如果必须使用混用,可以采用四种方式解决该问题:

(1).在业务类(调用类)的属性名与bean容器中的名称相同

如:

public class SayHello{
    @Autowired  
    private HelloWorld helloWorld; //此处属性名为helloWorld
}
(2.).去除@Autowired,直接在spring的bean配置文件中指定业务类属性对应的实例名称
    <bean id="sayHello" class="com.say.SayHello">  
            <property name="hello" ref="helloWorldImpl"></property>  
    </bean>  

(3).在@Autowired注解后面加上@Qualifie——(因为@Autowired默认是按照类型查找的)

public class SayHello{
    @Autowired  @Qualifie("hello")
    private HelloWorld hello; //注意此处的属性名不是helloWorld,而是hello
}
(4).将@Autowired替换成@Resource——(因为@Resource默认按照名称查找)
public class SayHello{
    @Resource
    private HelloWorld hello; //注意此处的属性名不是helloWorld,而是hello
}

 

 

常见错误:

1.通过配置文件配置bean时:

   启动项目时报错:spring找不到该类名

Cannot resolve reference to bean 'hessianHelloWorldImpl' while setting bean property 'hello';   
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:   
No bean named 'helloWorldImpl' is defined  

2.通过注解配置时:

   启动时不会报错,但是调用时会出现空指针异常

 

解决方式:检查配置文件是否有下面两行

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

 

分享到:
评论

相关推荐

    动态代理和注解Spring.rar

    在Java编程领域,Spring框架是应用最广泛的轻量级开源框架之一,它为开发者提供了丰富的功能,包括依赖注入(DI)、面向切面编程(AOP)以及声明式事务管理等。本资料“动态代理和注解Spring.rar”着重介绍了Spring...

    Spring-hibernate结合使用全xml配置方式

    本教程将详细介绍如何将两者结合,通过全XML配置方式进行集成,以实现高效、灵活的后端数据处理。 首先,我们需要了解Spring的核心组件。Spring框架提供了IoC(Inversion of Control,控制反转)和AOP(Aspect-...

    让Hibernate同时支持xml和注解两种映射方式

    Spring提供了`LocalSessionFactoryBean`用于配置基于XML的Hibernate映射,而`AnnotationSessionFactoryBean`则用于处理基于注解的映射。这两个类分别处理不同的映射方式,所以默认情况下,它们不能直接共存于同一个...

    31. Spring Boot导入XML配置【从零开始学Spring Boot】

    在本篇【从零开始学Spring Boot】系列教程中,我们将深入探讨如何在Spring Boot项目中导入并使用XML配置。Spring Boot以其简化Spring应用的初始搭建以及开发过程而闻名,通常推崇的是Java配置而非XML配置。然而,在...

    【基于xml方式】spring-kafka.zip

    在IT行业中,Spring框架是Java应用开发中...这个示例对于理解如何在Spring环境中使用Kafka进行消息传递非常有帮助,是学习和实践两者结合的好起点。通过深入分析和运行提供的代码,你将能够更深入地理解这一集成过程。

    spring-expression-3.2.1.RELEASE.zip

    标题中的"spring-expression-3.2.1.RELEASE.zip"是一个Spring框架的组件,Spring Expression Language (SpEL) 的特定版本。SpEL是Spring框架的一部分,它提供了一种强大的表达式语言,用于在运行时查询和操作对象图...

    Spring4.0与mybatis3.2整合全注解实现

    Spring MVC是一个强大的MVC框架,而MyBatis是一个轻量级的持久层框架,两者结合可以提供高效、灵活的数据访问解决方案。下面我们将详细介绍每个步骤和涉及的关键概念。 1. **Spring 4.0中的注解驱动开发** Spring ...

    学习Spring笔记_Annotation(注解)_Component

    4. **注解配置与XML配置的对比**:Spring框架既支持XML配置也支持注解配置。XML配置方式直观,但代码量大,维护困难;注解配置简洁,减少了XML配置文件,使代码更加清晰,同时提高了可读性和可维护性。然而,对于...

    官方原版spring-framework-5.0.4.RELEASE.rar

    10. **XML与注解配置**:Spring支持XML配置和注解配置,两者可以结合使用,提供了极大的灵活性。5.0版本中,注解配置更为流行,因为它减少了XML的繁琐,使得代码更加简洁。 11. **Spring Schema**:`spring-...

    Spring的注解配置与XML配置之间的比较

    Spring框架允许同时使用注解配置和XML配置,并能将两者的信息合并处理。这种混合配置方式让开发者可以根据具体需求灵活选择配置形式。对于类级别、相对固定且适合注解的配置,可以优先使用注解;而对于需要动态调整...

    spring-boot-examples-master.zip

    总结,`spring-boot-examples-master.zip`为我们提供了一个实用的Spring Boot与MyBatis集成学习资源。通过这个Demo,开发者可以直观地了解两者如何协同工作,进而掌握在微服务环境中构建数据访问层的方法。无论是...

    官方原版源码 spring-5.2.6.RELEASE.zip

    《Spring框架5.2.6.RELEASE源码详解》 ...通过阅读和分析源码,可以学习到设计模式、最佳实践以及如何处理复杂问题的策略。对于希望成为专业Java开发者的人来说,掌握Spring源码无疑是一项宝贵的技能。

    spring-mybatis-spring-1.0.1.zip

    二、Spring与MyBatis整合步骤 1. 添加依赖:在项目中引入Spring和MyBatis的jar包,以及它们的整合包`spring-mybatis-spring-1.0.1.jar`。 2. 配置Spring:在Spring的配置文件中,定义DataSource、...

    mybatis-demo8-单表注解配置.zip

    在实际应用中,你可以根据项目需求选择使用XML配置还是注解配置,或者两者结合使用。注解配置简化了配置过程,提高了开发效率,但在复杂查询或需要大量自定义配置的情况下,XML配置可能更为灵活。理解并熟练掌握...

    Spring+CXF 全注解版

    标题 "Spring+CXF 全注解版" 暗示了我们将探讨如何在Java应用程序中结合Spring框架和Apache CXF服务,利用注解来简化配置和开发过程。Apache CXF是一个开源的服务框架,它允许开发者创建和消费各种Web服务,而Spring...

    SpringDemo-master.zip

    总结起来,"SpringDemo-master.zip"是一个展示了Spring与MyBatis集成的实例,通过这个项目,开发者可以学习如何在Spring环境中配置和使用MyBatis,理解两者之间的协作机制,以及如何通过注解和XML配置文件实现数据...

    spring-mybatis-spring-2.0.3.zip

    Spring与MyBatis的整合旨在将Spring的管理能力应用到MyBatis的事务、数据库连接等操作上,实现更高效的数据库访问控制。这种整合可以避免手动管理SqlSessionFactory和SqlSession,提高代码的可维护性和可测试性。 ...

    spring-mybatis-spring-1.1.0.zip

    8. 注入Mapper:通过@Autowired或@Resource注解,将Mapper接口注入到需要使用的地方,即可调用其方法执行数据库操作。 本资源包“spring-mybatis-spring-1.1.0.zip”提供的正是这样一个完整的整合示例,它包含了...

    spring-mybatis-spring-3.0.1.zip

    资源包中的文件名"spring-mybatis-spring-3.0.1"表明了这个版本是针对Spring 3.0.1的,因此在使用时需要注意与之兼容的其他库版本。 四、免费下载与使用注意事项 "spring-mybatis-spring-3.0.1.zip"资源包提供免费...

    官方原版源码spring-framework-5.1.8.RELEASE.zip

    3. **依赖注入(Dependency Injection,DI)**:Spring的核心特性之一,通过配置或注解方式实现对象之间的依赖关系,降低了组件间的耦合度,提高了代码的可测试性和可维护性。 4. **AOP**:Spring的面向切面编程...

Global site tag (gtag.js) - Google Analytics