Wetts's blog

Stay Hungry, Stay Foolish.

0%

依赖注入-基于注解的配置

注解

  • @Component
  • @Repository:用于对DAO实现类进行标注
  • @Service:用于对Service实现类进行标注
  • @Controller:用于对Controller实现类进行标注
  • @Scope:指定Bean的作用范围
  • @PostConstruct:相当于init-method,可以在一个Bean中定义多个
  • @PreDestroy:相当于destroy-method,可以在一个Bean中定义多个
  • @Autowired:按类型注入
  • @Resource:按名称注入
  • @Inject:跟@Autowired类似,只不过没有required属性
  • @Lazy:设置懒加载

扫描注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<context:component-scan base-package="" />
指定路径,扫描该基路径里所有类的注解信息。

<context:component-scan base-package="com.wetts" resource-pattern="anno/*.class" />
扫描特定的类而非基路径下的所有类。
默认情况下resource-pattern属性的值为“**/*.class”,即基类包里的所有类。

<context:component-scan base-package="" />
<context:include-filter type="regex" expression="" />
<context:exclude-filter type="aspecj" expression="" />
</context:component-scan>
<context:include-filter>表示要包含的目标类,<context:exclude-filter>表示要排除在外的目标类。
<context:component-scan>下可以拥有若干个<context:include-filter>和<context:exclude-filter>元素。
这两个过滤元素均支持多种类型的过滤表达式:
annotation
示例:com.wetts.XxxAnnotation
所有标注了XxxAnnotation的类。该类型采用目标类是否标注了某个注解进行过滤。
assignable
示例:com.wetts.XxxService
所有继承或扩展了XxxService的类。该类型采用目标类是否继承或扩展某个特定类进行过滤。
aspectj
示例:com.wetts..*Service+
所有类名以Service结束的类及继承或扩展它们的类。
regex
示例:com\.wetts\.anno\..*
所有com.wetts.anno类包下的类。该类型采用正则表达式根据目标类的类名进行过滤。
custom
示例:com.wetts.XxxTypeFilter
采用XxxTypeFile通过代码的方式根据过滤规则。该类必须实现org.springframework.core.type.TypeFilter接口。

@Autowired@Resource

@Autowired

默认按类型匹配的方式,在容器中查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入到@Autowired标注的变量。

可以对类成员变量及方法的入参进行标注。

1
2
@Autowired
public void init(@Qualifier("userDao")UserDao userDao, LogDao logDao) {}

如果容器中没有一个和标注变量类型匹配的Bean,Spring容器启动时将报NoSuchBeanDefinitionException异常。如果希望Spring即使找不到匹配的Bean完成注入也不要抛出异常,那么可以使用@Autowired(required=false)进行标注。默认为true。

如果容器中有一个以上匹配的Bean时,则可以通过@Qualifier注解限定Bean的名称。

如果对类中集合的变量或方法入参进行@Autowired标注,Spring会将容器中类型匹配的所有Bean都自动注入进来。

1
2
@Autowired(required=false)
private List<Plugin> plugins;

@Resource

要求提供一个Bean名称的属性,如果属性为空,则自动采用标注处的变量名或方法名作为Bean的名称。