当开始看别人的代码使用注解的时候,以为照着别人的代码写,也写一个注释就能实现这样的功能,但是,现在开始考虑自动装配时怎样实现的.
首先,如果如果知道如何手动在xml配置中”装配bean”,那么在理解自动装配就比较简单了,如果想直接了解自动装配,那还得从手动装配开始.
XML配置里的bean的自动装配
*Spring IOC 容器可以自动装配Bean,需要做的仅仅是在Bean的autowire属性中指定自动装配的模式
*byType (根据类型自动装配):若IOC容器中有多个与目标Bean类型一致的Bean,Spring将无法判断使用那个Bean,所以不能执行自动装配,且抛出异常
*byName(根据名称自动装配):必须将目标Bean的名称和属性名的设置完全相同.(byName根据bean的名字和当前Bean的setter风格的属性名进行自动装配,若有匹配的的自动装配,若么有匹配的则不装配)
*constructor(通过构造器自动装配):当Bean中存在多个构造器时,此种自动装配方式将会很复杂.不推荐
*一般在实际开发中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力
使用注解的方式
组件扫描,Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件
特定组件包括
@Compontent,基本标示,标示了一个受Spring管理的组件
@Repository,标示持久层组件
@Service,标示服务层(业务层)组件
@controller,标示表现层组件
对于扫描到的组件,Spring有默认的命名策略,使用非限定类名,第一个字母小写,也可以在主键中通过Value属性值组件的名称
当在组件类上使用了特定的注解之后,还需要在Spring的配置文件中声明<context:component-scan>
-base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包里及其子类包中的所有类.
-当需要扫描多个包时,可以使用逗号分隔,
-如果仅希望扫描特定的类而非基包下的所有类,可以使用resource-pattern属性过滤特定的类,示例:
<context:component-scan base-package="com.study.spring.beans" resource-pattern="autowire/*.class"/> -<context:include-filter>子节点表示药包含的目标类 -<context:exclude-filter>子节点表示药排除在外的目标类 -<context:component-scan>下可以拥有若干个<context:include-filter>和<context:exclude-filter>子节点
组件装配
<context:component-scan>元素还会自动注册AutowiredAnnotationBeanPostProcessor实例,[email protected]@Resource,@inject注解属性
@Autowired注解自动装配具有兼容类型的单个Bean,可以用在构造器,普通字段(即使是非public),[email protected]
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/15397.html