`
dalongJDK
  • 浏览: 15747 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

spring基于注释(Annotation)

阅读更多
基于注释(Annotation)的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,提供了完全基于注释配置 Bean、装配 Bean 的功能,您可以使用基于注释的 Spring IoC 替换原来基于 XML 的配置。
 
   注释的优势:它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名、类型等信息,如果关系表字段和 PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取。
   
    注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和 Java 代码放在一起,有助于增强程序的内聚性。而采用独立的 XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。
      
    因此在很多情况下,注释配置比 XML 配置更受欢迎,注释配置有进一步流行的趋势。Spring 2.5 的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分XML 配置的功能。在这篇文章里,我们将向您讲述使用注释进行 Bean 定义和依赖注入的内容。

    原来我们是怎么做的
UserDAO.java: 

Java代码 
package com.tanlan.springdemo;   

/**  
* UserDAO接口  
*   
*/  
public interface UserDAO {   
    public void addUser();   
}
 

UserJDBCDAO.java: 
Java代码 
package com.tanlan.springdemo;   

/**  
* UserDAO的JDBC实现  
*   
*/   
public class UserJDBCDAO implements UserDAO {   
    public void addUser() {   
        System.out.println("使用JDBC增加用户信息!");   
    }   
  
}  


UserService.java: 
Java代码 
package com.tanlan.springdemo;   
/**  
* User业务逻辑处理类  
*   
*/  
public class UserService {   
    private UserDAO userDAO;   
  
    public void addUser() {   
        userDAO.addUser();   
    }   
  
    public UserDAO getUserDAO() {   
        return userDAO;   
    }   
  
    public void setUserDAO(UserDAO userDAO) {   
        this.userDAO = userDAO;   
    }   
  
}  



配置文件 spring.xml: 
Xml代码 
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
    <bean id="userJdbcDAO" class="com.tanlan.springdemo.UserJDBCDAO"></bean>  
    <bean id="userService" class="com.tanlan.springdemo.UserService">  
        <property name="userDAO" ref="userJdbcDAO"></property>  
    </bean>  
</beans>  


测试类Test.java: 
Java代码 
package com.tanlan.springdemo;   
  
import org.springframework.context.ApplicationContext;   
import org.springframework.context.support.ClassPathXmlApplicationContext;   
  
public class Test {   
  
    public static void main(String[] args) {   
        String[] files = { "spring.xml" };   
        ApplicationContext context = new ClassPathXmlApplicationContext(files);   
        UserService userService = (UserService) context.getBean("userService");   
        userService.addUser();   
    }   
  
} 


使用 @Autowired 注释
    Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

对UserService.java的改进:

Java代码 
package com.tanlan.springdemo;   
  
import org.springframework.beans.factory.annotation.Autowired;   
  
/**  
* User业务逻辑处理类  
*   
*/  
public class UserService {   
    @Autowired  
    private UserDAO userDAO;   
  
    public void addUser() {   
        userDAO.addUser();   
    }   
} 


这个类甚至可以省略getter/setter.

配置文件spring.xml的改进:
Xml代码 
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"></bean>  
    <bean id="userJdbcDAO" class="com.tanlan.springdemo.UserJDBCDAO"></bean>  
    <bean id="userService" class="com.tanlan.springdemo.UserService"></bean>  
</beans>  
 
   Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明AutowiredAnnotationBeanPostProcessor Bean。

    UserService类的属性不需要配置了。

当候选 Bean 数目不为 1 时的应对方法
    在默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。
    和找不到一个类型匹配 Bean 相反的一个错误是:如果 Spring 容器中拥有多个候选Bean,Spring 容器在启动时也会抛出 BeanCreationException 异常。
    Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称
加入现在多了一个UserDAO的实现类

UserHibernateDAO.java:

Java代码 
package com.tanlan.springdemo;   
  
/**  
* UserDAO的Hibernate实现  
*    
*/  
public class UserHibernateDAO implements UserDAO {   
    public void addUser() {   
        System.out.println("使用Hibernate增加用户信息!");   
    }   
}
 

更新spring.xml:
Xml代码 
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"></bean>  
    <bean id="userJdbcDAO" class="com.tanlan.springdemo.UserJDBCDAO"></bean>  
    <bean id="userHibernateDAO" class="com.tanlan.springdemo.UserHibernateDAO"></bean>  
    <bean id="userService" class="com.tanlan.springdemo.UserService"></bean>  
</beans>  


当Spring自动找寻UserDAO类型的类时,会找到两个符合要求的类:
No unique bean of type [com.tanlan.springdemo.UserDAO] is defined: expected single matching bean but found 2: [userJdbcDAO, userHibernateDAO] 



需要改进UserService.java:
Java代码 
package com.tanlan.springdemo;   
  
import org.springframework.beans.factory.annotation.Autowired;   
import org.springframework.beans.factory.annotation.Qualifier;   
  
/**  
* User业务逻辑处理类  
*   
*/  
public class UserService {   
    @Autowired  
    @Qualifier("userJdbcDAO")   
    private UserDAO userDAO;   
  
    public void addUser() {   
        userDAO.addUser();   
    }   
}  


使用 <context:annotation-config/> 简化配置
    Spring 2.1 添加了一个新的 context 的 Schema 命名空间,该命名空间对注释驱动、属性文件引入、加载期织入等功能提供了便捷的配置.

改进spring.xml:
Xml代码 
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
    <context:annotation-config></context:annotation-config>  
    <bean id="userJdbcDAO" class="com.tanlan.springdemo.UserJDBCDAO"></bean>  
    <bean id="userHibernateDAO" class="com.tanlan.springdemo.UserHibernateDAO"></bean>  
    <bean id="userService" class="com.tanlan.springdemo.UserService"></bean>  
</beans> 


注意命名空间:
xmlns:context=http://www.springframework.org/schema/context的添加。 
以及<context:annotation-config/>的使用。 


使用 @Component
Spring 2.5 提供的 @Component 注释可以定义 Bean,从 XML 配置文件中完全移除 Bean 定义的配置。

改进UserJDBCDAO.java:

Java代码
package com.tanlan.springdemo;   
  
import org.springframework.stereotype.Component;   
  
/**  
* UserDAO的JDBC实现  
*    
*/  
@Component("userJdbcDAO")   
public class UserJDBCDAO implements UserDAO {   
    public void addUser() {   
        System.out.println("使用JDBC增加用户信息!");   
    }   
  
} 


改进UserHibernateDAO.java:
Java代码 
package com.tanlan.springdemo;   
  
import org.springframework.stereotype.Component;   
  
/**  
* UserDAO的Hibernate实现  
*   
* @author tanlan tl_smile@163.com  
*   
* @date 2009-8-3  
*/  
@Component("userHibernateDAO")   
public class UserHibernateDAO implements UserDAO {   
    public void addUser() {   
        System.out.println("使用Hibernate增加用户信息!");   
    }   
} 



改进UserService.java:
Java代码 
package com.tanlan.springdemo;   
  
import org.springframework.beans.factory.annotation.Autowired;   
import org.springframework.beans.factory.annotation.Qualifier;   
import org.springframework.stereotype.Component;   
  
/**  
* User业务逻辑处理类  
*   
* @author tanlan tl_smile@163.com  
*   
* @date 2009-8-3  
*/  
@Component  
public class UserService {   
    @Autowired  
    @Qualifier("userJdbcDAO")   
    private UserDAO userDAO;   
  
    public void addUser() {   
        userDAO.addUser();   
    }   
}  

改进spring.xml:
Xml代码 
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
    <context:component-scan base-package="com.tanlan.springdemo"></context:component-scan>  
</beans>  


   在使用 @Component 注释后,Spring 容器必须启用类扫描机制以启用注释驱动 Bean 定义和注释驱动 Bean 自动注入的策略.
   <context:component-scan/> 的 base-package 属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理. 注释配置和 XML 配置的适用场合
    是否有了这些 IOC 注释,我们就可以完全摒除原来 XML 配置的方式呢?答案是否定的。有以下几点原因:
    注释配置不一定在先天上优于 XML 配置。如果 Bean 的依赖关系是固定的,(如Service 使用了哪几个 DAO 类),这种配置信息不会在部署时发生调整,那么注释配置优于 XML 配置;反之如果这种依赖关系会在部署时发生调整,XML 配置显然又优于注释配置,因为注释是对 Java 源代码的调整,您需要重新改写源代码并重新编译才可以实施调整。
    如果 Bean 不是自己编写的类(如 JdbcTemplate、SessionFactoryBean 等),注释配置将无法实施,此时 XML 配置是唯一可用的方式。
    注释配置往往是类级别的,而 XML 配置则可以表现得更加灵活。比如相比于@Transaction 事务注释,使用 aop/tx 命名空间的事务配置更加灵活和简单。
      
    所以在实现应用中,我们往往需要同时使用注释配置和 XML 配置,对于类级别且不会发生变动的配置可以优先考虑注释配置;而对于那些第三方类以及容易发生调整的配置则应优先考虑使用 XML 配置。Spring 会在具体实施 Bean 创建和 Bean 注入之前将这两种配置方式的元信息融合在一起。

分享到:
评论

相关推荐

    Spring基于注释(Annotation)的配置.pdf

    ### Spring基于注释(Annotation)的配置 #### 一、`@Autowired` 注释 `@Autowired` 是Spring框架提供的一种自动装配机制,用于简化Bean的依赖注入过程。该注解可以应用于类成员变量、方法及构造函数,帮助实现按...

    Spring注释 注入方式源码示例,Annotation

    花了些时间做了一个实验,彻底弄懂了spring Annotation注入的方式。凡带有@Component,@Controller,@Service,@Repository 标志的等于告诉Spring这类将自动产生对象,而@Resource则等于XML配置中的ref,告诉spring此处...

    spring 的Annotation方式

    ### Spring的Annotation方式详解 #### 引言 随着Spring框架的发展,其依赖注入(DI)机制也经历了从XML配置向注解驱动的重大转变。自Spring 3.0版本起,框架引入了一系列注解来简化依赖配置,使得开发人员能够在不...

    sping hibernate Annotation(注释配置) demo(例子)

    总结来说,这个 "Spring Hibernate Annotation demo" 展示了如何在 Spring 框架中使用注解配置来管理依赖,以及如何利用 Hibernate 的注解进行数据持久化。同时,它还涉及到了 Flex 前端与后端的交互。通过学习这个 ...

    spring_core_annotation:注释弹簧

    Spring Core Annotation,即Spring核心注解,是Spring框架中的一部分,用于声明式地配置和管理bean,使得代码更加简洁、易读且易于维护。本文将深入探讨Spring核心注解的相关知识点,帮助开发者更好地理解和运用这一...

    spring mvc注释文档

    ### Spring MVC注释文档知识点详解 #### 概述 随着技术的发展与演进,软件开发领域不断出现新的设计理念和技术框架。Spring MVC作为Spring框架的重要组成部分之一,在Spring 2.5版本中引入了基于注解的配置方式,...

    Spring2.5详细注解.doc

    Spring 2.5 版本引入了基于注释(Annotation)的配置,提供了完全基于注释配置 Bean、装配 Bean 的功能,以替换原来基于 XML 的配置。这种新的配置方式可以充分利用 Java 的反射机制获取类结构信息,减少配置的工作...

    springwebsocket 中文注释案例

    在Spring框架中,WebSocket的实现基于STOMP(Simple Text Oriented Messaging Protocol),这是一种轻量级的消息协议,适合用于Web环境。 要运行这个案例,首先确保开发环境满足以下条件: 1. JDK版本至少为1.7,...

    基于Maven,Struts2, Spring,Hibernate全注释的开发框架

    存贮过程进行操作,目前还有待完善,可以不用hibernate-generic-dao - Generic DAO, 用Spring3.2.0和Hibernate4替换,就是一个非常好的Struts2+Spring3+Hibernate4基于annotation的零配置的开发框架 借鉴网友的经验...

    Spring MVC入门 XML版本+注释版本

    &lt;bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/&gt; &lt;bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/&gt; ...

    Spring学习笔记

    Spring学习笔记Spring spring的配置 ... 基于注释的注入 Spring的自动注入和属性自动注入 AOP 静态代理 动态代理 使用spring实现AOP 基于Annotation实现AOP 基于XML实现AOP SSH的整合 spring集成jdbc

    java1.5 annotation注释源代码

    - **运行时处理**:例如`@PostConstruct`和`@PreDestroy`用于标记初始化和销毁方法,在Spring框架中,容器会在适当的时间调用这些方法。 - **代码生成**:例如`@Generated`注解可以表明代码由代码生成工具生成。 - *...

    使用Spring2.5的Autowired实现注释型的IOC

    "使用Spring2.5的Autowired实现注释型的IOC" 在Java开发中,IOC(Inversion of Control,控制反转)是一种常见的设计模式,它可以将对象之间的耦合关系解耦合,使得系统更加灵活和可维护。在Spring框架中,IOC是...

    spring4注解

    &lt;bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/&gt; ``` 通过这种方式,可以直接在Spring配置文件中定义一个`AutowiredAnnotationBeanPostProcessor`的bean...

    springMVC详解以及注解说明 中文WORD版.rar

    基于注释(Annotation)的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,提供了完全基于注释配置 Bean、装配 Bean 的功能,您可以使用基于注释的 Spring IoC 替换原来基于 XML 的配置。本文通过实例详细讲述了 ...

    spring-boot-graphql-annotation-example:Spring Boot Graphql注释示例

    Spring Boot Graphql注释示例 使用Graphql注释的Spring Boot Graphql Api示例 先决条件 Java 11 Maven的3.3+ Docker 19.03+ Docker Compose 1.25+ 安装 ./mvnw compile jib:dockerBuild docker-compose up -d ...

    使用annotation获取实体类注释

    这篇博客“使用annotation获取实体类注释”主要探讨了如何利用注解来增强代码的可读性和可维护性,同时介绍了如何从实体类中获取已定义的注解信息。以下是关于这个主题的一些关键知识点: 1. **注解定义**:注解以`...

    spring注解出现中文乱码

    - **修正方式**:根据Spring 3.0的规范,`mvc:annotation-driven`元素可以采用空元素的形式,即`&lt;mvc:annotation-driven/&gt;`。如果需要添加自定义的配置,可以使用`mvc:annotation-driven`标签加上相应的子元素。题目...

    Spring MVC upload/download file(注释和非注释实现)

    在本篇文章中,我们将深入探讨如何使用Spring MVC实现文件的上传与下载,包括注释方式和非注释方式的实现。 首先,我们需要在项目中引入Spring MVC的相关依赖,通常是在pom.xml文件中添加如下Maven依赖: ```xml ...

Global site tag (gtag.js) - Google Analytics