`
baobeituping
  • 浏览: 1064560 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Spring中使用annotation注入

 
阅读更多

我们使用Spring 一般式在xml配置文件中进行注入.但是这种方式使得配置过于臃肿。试想一个应用中,有上千个对象,而每个对象又需要注入很多其它 对象,那么我们的配置文件就显得非常的臃肿了。 Spring2.0 以后,我们可以使用annotation来为Spring的配置文件进行“减肥”
     我使用的是Spring2.5.
     第一:首先准备需要的jar包:SPRING_FRAMEWORK_HOME为spring发行包所在的目录


A)     SPRING_FRAMEWORK_HOME/dist/spring.jar 
B)     SPRING_FRAMEWORK_HOME/lib/ jakarta-commons/ commons-logging.jar
C)     SPRING_FRAMEWORK_HOME/lib/log4j / log4j- 1.2.15.jar(为了在项目中使用log4j输出日志信息)
D)     SPRING_FRAMEWORK_HOME/lib/j2ee/common-annotations.jar
    第二:引入Spring配置的命名空间以及命名空间的schema文件的配置.这些配置可以到参考手册中找到。参考手册在SPRING_FRAMEWORK_HOME/ docs/reference中。有html版本和pdf版本。找到【3.2.1.1. Configuration metadata】拷贝配置即可
 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       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 />
 
</beans>
在java代码中使用@Autowired或者@Resource注解方式进行装配。但我们要在xml配置中引入以下信息:
A)     context命名空间以及这个命名空间的schema文件
B)     <context:annotation-config /> Spring启用对annotation的支持。它其实是注册了多个对annotation进行解析处理的处理器:
         AutowiredAnnotionBeanPostProcessor
         CommonAnnotationBeanPostProcessor
         PersistenceAnnotionBeanPostProcessor
         RequiredAnnotationBeanPostProcessor.
(注意:annotation本身是不能干活的,要想让annotation干活,必须要有处理器来解析annotion)
 
第三:在java代码中使用@Resource进行注入
 public class UserService {
 @Resource(name="userDao")
 private UserDAO userDao;
 public UserDAO getUserDao() {
  return userDao;
 }
 public void setUserDao(UserDAO userDao) {
  this.userDao = userDao;
 }
 public String[] getAllUser(){
  return userDao.findUsers();
 }
}
 
第四:配置文件中的配置:
 
可以看到,我们没有在配置文件中为userService注入userDao,因为在 UserService类中使用annotation的方式注入
 
@Autowired 
1、Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。 
<!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 -->   
  1. <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>       
<!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 --><bean/>

或 者使用隐式注册(隐式注册 post-processors 包括 了 AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor。) 
Java代码 
<?xml version="1.0" encoding="UTF-8"?>   
<beans xmlns="http://www.springframework.org/schema/beans"              
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"              
xmlns:context="http://www.springframework.org/schema/context"              
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/>    
</beans>  
2、@Autowired默认按照类型匹配的方式进行注入 
3、@Autowired注解可以用于成员变量、setter方法、构造器函数等 
4、使用@Autowired注解须有且仅有一个与之匹配的Bean,当找不到匹配的 Bean 或者存在多个匹配的Bean时,Spring 容器将抛出 异常 
5、Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称。@Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。 
public class MovieRecommender {   

  
@Autowired  
@Qualifier("mainCatalog")   
private MovieCatalog movieCatalog;   
       
    private CustomerPreferenceDao customerPreferenceDao;   
  
    @Autowired  
    public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {   
        this.customerPreferenceDao = customerPreferenceDao;   
    }   
  
    // ...   
}  
@Resource 
1、@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,@Resource 默认按 byName 自动注入罢了。 
2、要让 JSR-250 的注释生效,除了在 Bean 类中标注这些注释外,还需要在 Spring 容器中注册一个负责处理这些注释的 BeanPostProcessor 
<bean  class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>   
<bean  class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

3、@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注 释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使 用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性, 这时将通过反射机制使用 byName 自动注入策略。 
 
public class SimpleMovieLister {   
  
    private MovieFinder movieFinder;   
  
    @Resource  
    public void setMovieFinder(MovieFinder movieFinder) {   
        this.movieFinder = movieFinder;   
    }   
}  
@PostConstruct 和 @PreDestroy 
标注了 @PostConstruct 注释的方法将在类实例化后调用,而标注了 @PreDestroy 的方法将在类销毁之前调用。 
[url=http://kdboy.javaeye.com/blog/419159#][/url] 
public class CachingMovieLister {   
  
    @PostConstruct  
    public void populateMovieCache() {   
        // populates the movie cache upon initialization...   
    }   
       
    @PreDestroy  
    public void clearMovieCache() {   
        // clears the movie cache upon destruction...   
    }   

 
@Component 
1、使用@Component注解可以直接定义Bean,而无需在xml定义。但是若两种定义同时存在,xml中的定义会覆盖类中注解的Bean定义。 
2、@Component 有一个可选的入参,用于指定 Bean 的名称。 
[url=http://kdboy.javaeye.com/blog/419159#][/url] 
@Component  
public class ActionMovieCatalog implements MovieCatalog {   
    // ...   
}  

3、<context:component-scan/> 允许定义过滤器将基包下的某些类纳入或排除。Spring 支持以下 4 种类型的过滤方式: 
过滤器类型表达式范例annotationorg.example.SomeAnnotationassignableorg.example.SomeClassregexorg\.example\.Default.*aspectjorg.example..*Service+

下面这个XML配置会忽略所有的@Repository注解并用“stub”储存库代替。 
[url=http://kdboy.javaeye.com/blog/419159#][/url] 
<beans ...>   
  
     <context:component-scan base-package="org.example">   
        <context:include-filter type="regex" expression=".*Stub.*Repository"/>   
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>   
     </context:component-scan>   
  
</beans>  

4、默认情况下通过 @Component 定义的 Bean 都是 singleton 的,如果需要使用其它作用范围的 Bean,可以通过 @Scope 注释来达到目标 
@Scope("prototype")   
@Repository  
public class MovieFinderImpl implements MovieFinder {   
    // ...   
}  
 
5、Spring 2.5引入了更多典型化注解(stereotype annotations): @Component、@Service和 @Controller。 @Component是所有受Spring管理组件的通用形式; 而@Repository、@Service和 @Controller则是@Component的细化, 用来表示更具体的用例(例如,分别对应了持久化层、服务层和表现层) 
@Service  
public class SimpleMovieLister {   
  
    private MovieFinder movieFinder;   
  
    @Autowired  
    public SimpleMovieLister(MovieFinder movieFinder) {   
        this.movieFinder = movieFinder;   
    }   
}   
  
@Repository  
public class JpaMovieFinder implements MovieFinder {   
    // implementation elided for clarity   
}  

6、要检测这些类并注册相应的bean,需要在XML中包含以下元素,其中'basePackage'是两个类的公共父包 (或者可以用逗号分隔的列表来分别指定包含各个类的包)。 
<?xml version="1.0" encoding="UTF-8"?>   
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xmlns:context="http://www.springframework.org/schema/context"  
       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="org.example"/>   
        
</beans>  
此 外,在使用组件扫描元素时,AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor会隐式地被包括进来。 也就是说,连个组件都会被自动检测并织入 - 所有这一切都 不需要在XML中提供任何bean配置元数据。
分享到:
评论

相关推荐

    Spring IOC Annotation 注入 学习实例

    在`IOC_Project`这个压缩包文件中,很可能是包含了一个示例项目,用于演示如何使用Spring的IOC Annotation注入。通过查看和运行这个项目,你可以更深入地了解这些概念并实践它们。项目的结构可能包括了源代码文件(`...

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

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

    扩展Spring—使用Annotation将配置资源注入到Bean中

    在Spring框架中,注解(Annotation)的使用极大地简化了传统XML配置的复杂性,使得开发者可以更加专注于业务逻辑的实现。本篇文章将深入探讨如何通过注解将配置资源注入到Bean中,以此来理解Spring的注解驱动开发。 ...

    Spring+mybatis annotation形式

    在Spring中,我们可以使用`@Configuration`和`@Bean`注解来替代XML配置文件。`@Configuration`注解表明当前类是一个配置类,可以创建bean。`@Bean`注解则标记在方法上,表示该方法会返回一个bean实例。例如,创建...

    spring的Annotation注解.

    // 或者在方法中使用 @Autowired public void setMovieFinder(@Qualifier("mainCatalog") MovieFinder movieFinder) { this.movieFinder = movieFinder; } ``` 上述代码展示了如何使用`@Autowired`与`@...

    Spring annotation

    Spring框架是Java开发中不可或缺的一部分,它通过提供丰富的注解简化了依赖注入、配置管理和AOP(面向切面编程)等任务。本文将深入探讨Spring注解及其在实际开发中的应用。 1. **依赖注入(Dependency Injection, ...

    spring 的Annotation方式

    本文旨在深入探讨Spring框架中基于注解的依赖注入机制,特别是`@Repository`、`@Service`、`@Controller`和`@Component`等核心注解的使用方法,以及如何利用`&lt;context:component-scan&gt;`自动扫描功能,实现类级别的...

    详解Spring_3.0基于Annotation的依赖注入实现

    ### 详解Spring 3.0基于Annotation的依赖注入实现 #### 概述 Spring框架作为一个广泛使用的Java开发框架,提供了强大的依赖注入(Dependency Injection, DI)能力,帮助开发者轻松管理和组织复杂的Java应用。随着...

    Spring Annotation简介一

    1. **依赖注入(Dependency Injection, DI)**:Spring Annotation中最常用的注解之一是`@Autowired`,它实现了自动装配bean。当在类的字段或构造器上使用`@Autowired`时,Spring会自动寻找类型匹配的bean并注入。...

    Spring - Annotation 自动匹配注入IOC

    在Spring框架中,注解(Annotation)自动匹配注入IoC(Inversion of Control,控制反转)是一种关键特性,它极大地简化了Java应用的配置管理。本文将深入探讨这一主题,帮助开发者更好地理解和利用这一功能。 首先...

    详解Spring基于Annotation的依赖注入实现

    在深入探讨Spring框架中基于注解(Annotation)的依赖注入(Dependency Injection,简称DI)实现之前,我们首先需要理解几个核心概念:Spring框架、依赖注入、以及注解本身。 ### Spring框架简介 Spring框架是一个...

    Spring的Annotation配置相关讲义

    在Spring框架中,Annotation配置是一种简洁且强大的方式来管理Bean的定义和依赖注入,它消除了传统的XML配置文件,使得代码更加简洁、易读。在Spring 3.0及以上版本中,Annotation配置得到了广泛的应用。 首先,...

    Spring标注(Annotation)的使用

    这篇文档将深入探讨Spring注解的使用,包括它们如何工作以及如何在实际项目中应用。 首先,让我们了解Spring的核心注解。@Component 是基础注解,用于标记一个类为Spring管理的Bean。@Service 和 @Repository 是 @...

    spring annotation注解

    在使用 Spring 框架之前,我们通常使用 setter 方法来注入属性,例如: Java 代码 ```java public class UserManagerImpl implements UserManager { private UserDao userDao; public void setUserDao(UserDao ...

    学习Spring笔记_Annotation(注解)_Component

    本篇笔记主要关注Spring中的注解(Annotation)和@Component,这两大概念是Spring框架的重要组成部分,也是理解SpringIoC(控制反转)和AOP(面向切面编程)的基础。 首先,注解(Annotation)是Java提供的一种元...

    3Spring使用annotation方式autowire

    在Spring框架中,注解(Annotation)的使用极大地简化了依赖注入(Dependency Injection,简称DI)的过程,使得代码更加简洁且易于维护。本篇将详细探讨"3Spring使用annotation方式autowire"这一主题,包括注解驱动...

Global site tag (gtag.js) - Google Analytics