<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <!-- 通过注解的方式配置bean, component-scan: 扫描包 base-package:扫描该包下面的所有类,当扫描多个包时可以用逗号隔开 --> <!-- 组件扫描:Spring能够自动从classpath下自动扫描、侦测和实例化具有特定注解的组件 特定组件包括: 1、 @Component 基本注解,将普通类标记为bean,加入到容器里,并且是单例模式 2、 @Controller 标识表现层组件 3、 @Service 标识服务层(业务层)组件 4、 @Repository 标识持久层组件 对于扫描到的组件,Spring有默认的命名策略,对于非限定类,第一个字母小写 也可以在注解中通过value属性标识组件的名称 --> <!-- context:component-scan 元素会自动注册AutowiredAnnotationBeanPostProcessor(后置处理器)实例 该实例可以自动装配带有@Autowired、@Resource 和@Inject注解的属性 注:@autowired 最常用 一、@Autowired 1、该注解会自动装配具有兼容类型的单个bean属性 2、应用范围:构造器、普通字段(即使是非public),一切具有参数的方法都可以应用 3、默认情况下,所有使用@Autowired注解的属性都需要被设置,当Spring找不到匹配的bean装配属性时,会抛出异常 注:若某一属性允许不被设置,可以设置@Autowired的required属性为false 4、默认情况下,当IOC容器里存在多个类型兼容的bean时,通过类型的自动装配无法正常工作,此时可以在@Qualifier 注解里提供Bean的名称,Spring允许对方法的入参标注@Qualifier以指定注入bean的名称 注:问题?如果使用@Autowired自动装配有多个的bean,想要匹配与之相应的bean,有几种解决方案? 1)与@Qualifier注解连用,指定相应bean的名称 2)在类上加@Repository、@Service时指定value属性,名字与匹配类相同,首字母小写 5、将@Autowired标注在集合上 1)应用在数组类型上,Spring将会把所有匹配到的bean自动装配上 2)应用在集合属性上,Spring读取该集合的类型信息,然后自动装配与之兼容的bean 3)应用在Map上,如果map的健值为String,那么Spring会自动装配与Map值类型兼容的bean 此时bean的名称作为健值 二、@Resource 1、该注解与@Autowired注解类似,需要bean提供一个名称的属性,若该属性为空, 则自动采用标注处的变量或方法名作为Bean的名称 三、@Inject 1、该注解与@Autowired注解类似,只是没有required属性,一般能用@Autowired的就不用@Inject Inject注解是javax JSR330规范之一,使用Inject注解需要添加Javax Inject依赖 --> <!-- @Autowired 与 @Resource注解的区别: 1、@Autowired来源于Spring框架,@Resource来源于JSR-250规范 2、@Autowired只按照byType注入,@Resource默认按byName注入 3、@Autowired按类型装配依赖对象,默认情况下它要求对象必须存在,如果允许为null值,可以设置required属性为false。 如果想要使用按名称装配,可以结合@Qualifier注解一起使用。 @Resource中有两个重要的属性:type和name 1)name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称去寻找依赖对象 2)如果按照名称也没有找到依赖对象时,@Resource注解会回退到按类型装配,如果指定了name属性,就只能按照名称装配了 注:推荐使用@Resource注解在字段上,这样就不用些setter方法,而且这个注解属于J2EE的,降低的Spring的耦合性 代码看起来更加美观。 --> <context:component-scan base-package="com.spring.cn.annotation"/> <!-- resource-pattern: 只扫描特定的类而非基包下的所有类 扫描controller包下的所有类 --> <!--<context:component-scan base-package="com.spring.cn.annotation"--> <!--resource-pattern="controller/*.class"/>--> <!-- 1、exclude-filter:子节点,指定排除哪些指定表达式的组件 2、include-filter:子节点,指定包含哪些指定表达式的组件,需要与use-default-filters="false"连用 3、use-default-filters:默认为true 4、在component-scan下可以拥有多个子节点 exclude-filter和include-filter支持多种表达式,最常用的是annotation和assignable 1、annotation 标注了注解的类 import org.springframework.stereotype.Controller; 2、assignable 所有继承和扩展的类 package com.spring.cn.annotation.controller下面的类 --> <!--<context:component-scan base-package="com.spring.cn.annotation" use-default-filters="false">--> <!--<context:component-scan base-package="com.spring.cn.annotation">--> <!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> --> <!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> --> <!-- <context:exclude-filter type="assignable" expression="com.spring.cn.annotation.controller.UserController"/> --> <!-- <context:include-filter type="assignable" expression="com.spring.cn.annotation.controller.UserController"/> </context:component-scan>--> </beans>