严格的说,实际分为自动检测和自动装配两方面。
先说自动检测,自动检测就是允许Spring自动检测与定义Bean。这就意味着,不使用<bean/>,你也能实现Spring中大多数的Bean的定义和装配。
为启用这一功能,你得引入context命名空间。
<?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.xsd">
        
    <context:component-scan
        base-package="org.chen.auto">
    </context:component-scan>
</beans>问题来了,如果你要使多个包下的类都能被检测怎么办?谷歌 “context:component-scan multiple package”,答案是:
<context:component-scan base-package="x.y.z.service, x.y.z.controller" />
那么Spring会为哪些类注册成Bean呢?默认的,<context:component-scan>会查找使用构造型(stereotype)注解所注解的类,包括:
package org.chen.auto;
import org.springframework.stereotype.Component;
@Component("my-guitar")
public class Guitar implements Instrument {
	public void play() {
		System.out.println("play guitar ... ");
	}
}这样就完成了自动检测和注册。
但是,如果需要把一个包下面的所有类写上个@Component也是够烦的。Spring为我们提供了过滤组件的扫描。
<context:include-filter /> 和 <context:exclude-filter />,分别是包含和排除。
比如,
如果我们使用,
  <context:component-scan
        base-package="org.chen.auto">
        <context:include-filter type="assignable" expression="org.chen.auto.Instrument"/>
    </context:component-scan>type是过滤类型,
基于注解的过滤方式是最常用的。
下面说说自动装配。
@Autowired注解和@Inject能完成类似的工作。不同的是,@Inject是Java语言自带的,推荐用它,javax.inject是JavaEE版本的,如果你使用的是Java SE版本,需要手动添加到build path,如果你使用的是Maven,可添加下面的依赖:
	<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
       </dependency>由于@Inject是按类型装配的,所以如果容器里有多个类型满足,则会报错。我们这时可以使用@Named来限定(默认使用Bean的ID)。
@Component
public class TestBean {
	@Inject
	@Named("pianeo")
	private Instrument instrument;
	
	public void say(){
		System.out.println("test bean is saying ...");
		
		instrument.play();
		
	}
}@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {}如果要写出@Component,即
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)@Component
public @interface MyAnnotation {}其中,@Target是目标,表示该注解能用在何处。包括:
@Retention表示你将保持这个注解多久,
这是来自Oracle的文档的截图。有源码,.Class文件,运行时三种。
原文:http://blog.csdn.net/chenloveit/article/details/38827969