概要:
再classpath中扫描组件
- 组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件
- 特定组件包括:
- @Component:基本注解,标示了一个受Spring管理的组件(可以混用,spring还无法识别具体是哪一层)
- @Respository:建议标识持久层组件(可以混用,spring还无法识别具体是哪一层)
- @Service:建议标识服务层(业务层)组件(可以混用,spring还无法识别具体是哪一层)
- @Controller:建议标识表现层组件(可以混用,spring还无法识别具体是哪一层)
- 对于扫描到的组件,Spring有默认的命名策略:使用非限定类名,第一个字母小写(UserServiceImpl-》userServiceImpl),也可以再注解中通过value属性值标识组件的名称(通常可以将UserServiceImpl —》userService,可以将Impl拿掉,这是一个习惯)
在classpath中扫描组件
- 当在组件类中使用了特定的注解之后,还需要在Spring的配置文件中声明<context:component-scan>:
- base-package属性指定一个需要扫描的基类包,Spring容器将会扫描整个基类包里及其子包中的所有类
- 当需要扫描多个包时,可以使用逗号分隔
- 如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类,实例:
- <context:include-filter>子节点表示要包含的目标类
- <context:exclude-filter>子节点表示要排除在外的目标类
- <context:component-scan>下可以拥有若干个<context:include-filter>和<context:exclude-filter>子节点
- <context:include-filter>和<context:exclude-filter>子节点支持多种类型的过滤表达式:
组件装配
- <context:component-sacn>元素还会自动注册AutowireAnnotationBeanPostProcessor实例,该实例可以自动装配具有@Autowired和@Resource、@Inject注解的属性
使用@Autowired自动装配Bea
n
- @Autowired注解自动装配具有兼容类型的单个Bean属性
- 可以放在构造器或普通字段(即使是非public)或一切具有参数的方法都可以应用@Authwired注解
- 默认情况下,所有使用@Autowired注解的属性都需要被设置,当Spring找不到匹配的Bean装配属性时,会抛出异常,若某一属性允许不被设置,可以设置@Authwired注解的required属性为false
- 默认情况下,当IOC容器里存在多个类型兼容的Bean时(@Autowired先是按照类型匹配Bean,如果存在多个类型相同的Bean,此时IOC容器会去寻找与属性名相同名字的Bean),通过类型的自动装配将无法工作,此时可以在@Qualifier注解里Bean属性的名称。Spring允许对方法的方法的输入参数标注@Qualifier以指定注入Bean的名称
- @Authwired注解也可以应用在数组类型的属性上,此时Spring将会把所有匹配的Bean进行自动装配
- @Authwired注解也可以应用在集合属性上,此时Spring读取该集合的类型信息,然后自动装配所有与之兼容的Bean
- @Authwired注解用在java.util.Map上时,若该Map的键值为String,那么Spring将会自动装配与之Map值类型兼容的Bean,此时Bean的名称作为键值
使用@Resource或@Inject自动装配Bean
- Spring还支持@Resource和@Inject注解,这两个注解和@Autowired注解的功能类似
- @Resource注解要求提供一个Bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为Bean的名称
- @Inject和@Autowired注解一样也是按照类型匹配注入的Bean,但没有required属性
- 建议使用@Autowired注解
- @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。
@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性
则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果
既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1.如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3.如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4.如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,
如果匹配则自动装配;
@Qualifier 为javax.inject中,注释注释类型
@Autowired
The original, "proprietary" annotation from Spring.
- not standard, Spring proprietary
+ resolves by type
+ for optional dependencies
@Resource
The JSR-250 annotation
+ standard dependency injection
- resolves by name, fallback by type
- not for optional dependencies
@Inject
The JSR-330 annotation
+ resolves by type
+ standard dependency injection
- not for optional dependencies