博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring实战 (三) 装配Bean
阅读量:7032 次
发布时间:2019-06-28

本文共 2436 字,大约阅读时间需要 8 分钟。

hot3.png

在Spring配置文件中添加以下代码可以扫描指定包下所有标注@Component, @Repository, @Service, @Controller的POJO将其变为Spring容器管理的Bean

Spring3支持以下3种用于自动装配的注解

  • Spring自带的@AutoWired注解
  • JSR-330的@Inject注解
  • JSR-250的@Resource注解

使用@Autowired自动装配

@AutoWired使用ByType的方式自动装配,此直接可以标注setter方法,构造器,甚至其他需要自动装配Bean的任意方法.例如为Computer装配Cpu

setter方法, 构造器, 任意方法

@AutoWiredpublic void setCpu(Cpu cpu){    this.cpu = cpu;}
@Autowiredpublic Computer(Cpu cpu){    this.cpu = cpu;}
@Autowiredpublic void buyCpuForComputer(Cpu cpu){    this.cpu = cpu;}

使用@Autowired的错误

  1. 默认情况下@Autowired具有强契约的特征,其所标注的属性或者参数必须是可装配的.如果没有Bean可以装配就会抛出NoSuchBeanDefinitionException异常,可以使用@Autowired(required = false)来避免这个讨厌的异常
  2. 因为@Autowired使用byType的方式.所以可能存在多个Bean满足条件.这个时候也会抛出NoSuchBeanDefinitionException.这个时候可以使用@Qualifier注解来明确使用id来选择Bean
    @Autowired@Qualifier("coreI7") //选择ID为coreI7的Beanprivate Cpu cpu;
    @Qualifier标注类,可以限定Bean的名字
    @Qualifier("coreI7")public class Cpu {}
创建自定义的Qualifier限定器
只需要定义一个注解,并使用@Qualifier类作为他的元注解即可.以下我们创建一个CoreI7注解.

@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Qualifierpublic @interface CoreI7{}
用@CoreI7标注一个Cpu
@CoreI7public class Cpu {}
使用@Autowired注入Bean时用@CoreI7来限定
@Autowired@CoreI7private Cpu cpu;

使用@Inject实现基于标准的自动装配

@Inject注解是JSR-330的核心部件,该注解几乎可以完全替换Spring的@Autowired注解,但是@Inject没有required属性,所以@Inject标注的依赖关系必须存在,否则抛出异常

对应于@Autowired的@Qualifier注解,@Inject也有一个@Named注解.@Qualifier注解帮助我们缩小匹配Bean的选择范围(默认使用Bean的ID),而@Named通过Bean的ID来标识可选择的Bean

JSR-330在javax.inject包里也有自己的@Qualifier注解.可以通过这个注解来创建自己的限定器.唯一与Spring的@Qualifier注解不同的是一个来自于javax.inject包,另一个来自于org.springframework.beans包.

在注解注入中使用表达式

@Value是Spring3.0新引入的装配注解.可以让我们使用注解装配String类型的值和基本类型的值,例如int,boolean

例如

@Value("Kenshiro")private String name;
以上代码为name属性装配一个String类型的值-Kenshiro

以下代码使用SpEL从系统属性中获取一个值

@Value("#{systemProperties.myName}")private String name;

过滤组建扫描

默认情况下,<context:component-scan />查找使用构造型(stereotype)注解所标注的类,这些特殊的注解如下

  • @Component-通用的构造型注解,标识该类为Spring组建
  • @Controller-标识该类定义为Spring MVC Controller
  • @Repository-标识该类定义为数据仓库
  • @Service-标识该类定义为服务
  • 使用@Component标识的任意自定义注解
通过配置<context:include-filter />
和<context:exclude-filter />,我们可以随意调整扫描行为.

过滤器类型 描述
annotation 过滤器扫描使用指定注解所标注的那些类,通过expression属性指定要扫描的注解
assignable 过滤器扫描派生于expression属性所指定类型的那些类
aspectj 过滤器扫描与expression属性所战鼓赌博更的AspectJ表达式所匹配的那些类
custom 使用自定义的org.springframework.core.type.TypeFilter实现类,该类由expression属性指定
regex 过滤器扫描类的名称与expression属性所指定的正则表达式所匹配的那些类

转载于:https://my.oschina.net/kenshiro/blog/159971

你可能感兴趣的文章
JavaScript 算法之复杂度分析
查看>>
第六章——函数(inout参数与变异方法)
查看>>
掘金翻译计划月报 — 2018 年 2 月
查看>>
Android属性动画
查看>>
渐进式Express源码学习5-全副武装
查看>>
JVM难学?那是因为你没认真看完这篇文章
查看>>
python面试题(五)
查看>>
老司机 iOS 周报 #40 | 2018-10-22
查看>>
VirtualView iOS 模板加载功能实现详解
查看>>
这可能是最好的性能优化教程(二)
查看>>
被马化腾点赞的微信车票设计,背后有哪些故事?
查看>>
Spring理论基础-面向切面编程
查看>>
BloomFilter 原理,实现及优化
查看>>
PHP本地文件包含漏洞环境搭建与利用
查看>>
OGNL设计及使用不当造成的远程代码执行漏洞
查看>>
Vue-cli + express 构建的SPA Blog(采用前后端分离方案)
查看>>
ios中的多播委托
查看>>
Java基础-单例模式
查看>>
轻仿QQ音乐之音频歌词播放、锁屏歌词
查看>>
MongoDB 4.0 RC 版本强势登陆
查看>>