《Spring》(十一) ---- 基于注解的依赖注入

  • @Autowired

@Autowired市按照类型匹配进行依赖注入的,它可以标注于类定义的多个位置:

  1. 域或属性
  2. 构造方法定义
  3. 方法定义  @Autowired不仅可以标注在传统的setter方法之上,而且还可以标注于任意名称的方法定义,只要该方法定义了需要被注入的参数就行。

为了给容器中定义的每个bean定义对应的实例注入依赖,需要遍历所有bean,然后通过反射,检查每个bean定义对应的类上各种可能位置上的@Autowired,如果存在,就可以从当前容器管理的对象中获取符合条件的对象,设置给@Autowired所标注的属性域/构造方法或方法定义。AutowiredAnnotationBeanPostProcessor是Spring提供的用于这个目的的BeanPostProcessor实现,所以只要在IoC容器的配置文件中追加

<bean class="org.springframework.beans.factory.annotation. 
AutowiredAnnotationBeanPostProcessor"/>

就可以让整个应用开始运作了。

  • @Qualifier

@Qualifier是byName自动绑定的注解版,IoC容器无法从多个同一类型的实例中选取我们真正想要的,那就用@Qualifier直接点名。

 

  • @Resource

IoC容器根据@Resource所制定的名称,到容器中查找beanName与之对应的实例,然后将查找到的对象实例注入给@Resource所标注的对象。例如

public class FXNewsProvider {
    @Resource(name="djNesListener")
    private IFXNewsListener newsListener;
    @Resource(name="djNesPersister")
    private IFXNewsPersister newsPersister;
}

@Resource和@Autowired标注的地方大致相同,都可以标注在属性域或方法上,也可以在构造方法或普通方法上标注。

 

  • @PostConstruct 和 @PreDestory

这两个注解并不是服务于依赖注入的,主要用于标注对象生命周期管理相关方法,与Spring的InitializingBean和DisposableBean接口,以及配置中的init-method和destroy-method起到类似作用。

只使用@Resource, @PostConstruct和@PreConstruct,并不能立马起作用。就像@Autowired需要AutowiredAnnotationBeanPostProcessor一样,这些注解也需要一个BeanPostProceesor,即CommonAnnotationBeanPostProcessor,这样这些注解才能发挥作用。

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

 

既然不管是@Autowired还是@Resource都需要添加相应的BeanPostProcessor到容器,那我们可以在基于XSD的配置文件中使用一个<context:annotation-config> 配置搞定义上所有的BeanPostProcessor。

<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" 
  xmlns:p="http://www.springframework.org/schema/p" 
  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/>
  <bean id="newsProvider" class="..FXNewsProvider"/>
  <!--其他bean定义-->
    ...
</beans>

  Spring提供的@Autowired加上@Qualifier和JSR250提供的@Resource等注解属于不同派系,如果要实现依赖注入的话,使用一个派别的注解就可以了。

  •  classpath-scanning

  不仅依赖关系可以用注解,不用xml配置,Bean的定义也可以不用配置。这就需要classpath-scanning功能了。

  使用相应的注解对组成应用程序的相关类进行标注后,classpath-scanning功能可以从某一顶层包(base package)开始扫描。当扫描到某个类标注了相应注解后,就会提取该类的相关信息,构建对应的BeanDefinition,然后把构建完的BeanDefinition注册到容器。

<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.spring21"/> </beans>

  如果要扫描的类定义在不同的包下面,也可以为base-package指定多个以逗号分隔的扫描路径。

  <context:component-scan>默认扫描的注解类型是@Component,不过在@Component语义基础上细化后的@Repository,@Servicce和@Controller也同样可以被扫描到。

  <context:component-scan>在扫描相关类定义并将它们添加到容器的时候,会使用一种默认的命名规则,来生成那些添加到容器的bean定义的名称(beanName)。这种命名规则就是类名称首字母小写后就是该类bean的beanName。如下例,如果使用默认名称就是如果想自定义一个名称,可以这样写:

@Component("djNewsListener") 
public class DowJonesNewsListener implements IFXNewsListener

  <context:component-scan>不仅把注册bean的功能完成了,甚至把<context:annotation-config>的任务也完成了,所以只用<context:component-scan>就可以扫描到bean, 并把它们的依赖关系也注册到了容器中。除此之外,<context:component-scan>的嵌套配置项可以对默认的扫描结果进行过滤以排除某些类。

<context:component-scan base-package="org.spring21">
  <context:include-filter type="annotation" 
   expression="cn.spring21.annotation.FXService"/>
  <context:exclude-filter type="aspectj" expression=".."/>
</context:component-scan>

 

转载于:https://www.cnblogs.com/IvySue/p/6524632.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值