0%

Classpath扫描与组件管理

从 Spring3.0开始,Spring JavaConfig 项目提供了很多特性,包括使用 java 而不是 XML 定义 bean .

比如

  • @Configuration,@Bean,@Import,@DependsOn
  • @Component是一个通用注解,可用于任何bean
  • @Repository,@Service,@Controller是更有针对性的注解
    • @Repository通常用于注解DAO类,即持久层
    • @Service通常用于注解Service类,即服务层
    • @Controller通常用于Controller类,即控制层(MVC)

类的自动检测及Bean的注册

为了能够检测这些类并注册相应的Bean,需要下面内容

1
2
3
4
5
6
7
8
9
10
11
12
<?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">
<!-- 注解扫描dao和service类 -->
<!-- 该组件扫描器,会去扫描@Component、@Controller(表现层)、@Service(业务层)、@Repository(持久层)、@RestController -->
<context:component-scan base-package="com.kkb.project" />
</beans>
  • context:component-scan 包含c ontext:annotation-config ,通常在使用前者后,不用再使用后者
  • AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor也会被包含进来

使用过滤器进行自定义扫描

  • 默认情况下,类被自动发现并注册bean的条件是:使用@Component,@Repository,@Service,@Controller注解或者使用@Component的自定义注解

    Spring – context:component-scan使用说明
    上面这篇文章写的很详细,可供参考

作用域(Scpoe)

  • 通常情况下自动查找的Spring组件,其scope是singleton,Spring2.5提供了一个标识scope的注解@Scope
1
2
3
4
5
@Scope("prototype")
@Repository
public class MovieFinderImpl implements MovieFinder(){
//...
}
  • 也可以自定义scope策略,实现ScopeMetadataResolver接口并提供一个无参构造器
1
2
3
4
<beans>
<context:component-acan base-package="org.example"
scope-resolver="org.example.MyScopeResolver"/>
</beans>

代理方式

  • 可以使用scoped-proxy属性指定代理,有三个值可选:no(default),interfaces,targetClass
    1
    2
    3
    <beans>
    <context:component-scan base-package="org.example" gcoped-proxy="intexfaces"/>
    </beans>