一、前言
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