一、前言

Spring的Bean Factory所实现的IoC轻量级容器,可以很方便地让大家基于POJO开发JavaEE应用程序。

创建应用对象之间协作关系的行为通常称为装配

Spring中有三种装配Bean的方法

  • 在XML中显式配置
  • 在Java中显式配置
  • 隐式的bean发现机制和自动装配

这儿要说的就是第三个“自动发现与装配”,它会带来编程的快感。

二、隐式的bean发现机制和自动装配

隐式配置分成两步 1、组件扫描 2、自动装配

1、组件扫描

组件扫描可以通过XML配置实现

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd";> 

    <context:component-scan base-package="xyz.mrwood.study.spring.example" /> 
</beans>

2、自动装配

spring自动满足bean之间的依赖,通过Autowired来进行依赖的注入

@Component 
public class Waiter { 
    public void service(String name){ 
        System.out.println("service to " + name); 
    } 
}

@Component 
public class Store { 
    @Autowired 
    private Waiter waiter; 

    public void service(){ 
        waiter.service("kiwi"); 
    } 
}

spring中所有bean都会有一个ID,我们通过@Component设置的,自动扫描时会以类名首字母小写为ID。如果想要自定义就要设置@Component的参数。

@ComponentScan默认是扫描当前包以及子包。如果想设置其它包或者多个包,可以通过设置该注解的basePackages。但是这种是以字符串形式不利于重构。可以使用另外一个属性backPackageClasses指定某个类(开发中常用标记接口),然后spring会扫描这个类下面的包与子包。

可以使用java规范的@Named替换@Component,也可以使用java规范的@Inject去替换@Autowired

三、何来快感

工作最常用的是隐式配置,因为自动扫描非常方便,但是有些情况下只能使用显式的手动配置。比如引入一些第三方库,要想让spring管理这个bean。不可能修改它的源码。只能通过显式配置。

1、@Component @Repository @Service @Controller

默认的,以@Component @Repository @Service @Controller或者被@Component注解的自定义注解所注解的类,是唯一的自动发现候选组件。
开启组件扫描后,你想要自动装配两个对象的话,就无需配置XML了,只要在被引用的对象的类上加上注解:@Component或其它几个,然后在引用方类中,定义被引用对象的私有变量上加上注解:@Autowired,就搞定了(参考“自动装配”小节的例子)。是不是很爽。

2、抛弃@Component @Repository @Service @Controller

你甚至可以抛弃这几个自动发现候选组件。这样的话,只需要利用@Autowired注解,就可以装配相关的对象了。想象一下,你定义了许多服务类,然后你想要引用它们时,只需定义一个服务类属性,然后加上@Autowired注解,Spring框架就自动为你装配好了,是不是很爽。

不过想要抛弃这几个自动发现候选组件,你得做一点儿额外得工作,那就是配置一下filter。

<beans>
    <context:component-scan base-package="org.example">
        <context:include-filter type="regex"  expression=".*Stub.*Repository"/>
    </context:component-scan>
</beans>

看到没,只需要在component-scan元素中,加入include-filter子元素即可。base-package设定为你的服务类所在的namespace,type设定为regex,expression设定为你的服务类类名所满足的正则表达式。

OK搞定了。接下来你就可以只使用@Autowired注解来装配任何一个你想要的服务类了。

参考文档:http://blog.csdn.net/u0117192...
参考文档:Spring Framework Reference Document


执着的慢行者
223 声望21 粉丝

大型电子商务系统架构师、项目管理专家