标签:
Bean管理的注解实现
(一) Classpath扫描与组件管理
- @Repository 通常用于注解DAO类,即持久层
- @Service 通常用于注解 Service类,即服务层
- @Controller 通常用于注解Controller类,即控制层
(二) 类的自动检测及Bean的注册
Spring可以自动检测类并注册Bean到ApplicationContext中
(三) <context:annotation-config/>
<?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-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> <context:annotation-config/> <beans/>
(四)类的自动检测及Bean的注册(补充)
为了能够检测这些类并注册相应的bean,需要下面的内容:
<?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-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> <context:component-scan base-package="com.mypackage"></context:component-scan> </beans>
该配置隐式注册了多个对注解进行解析的处理器,如:
AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor
其实,注解本身做不了任何事情,和XML一样,只起到配置的作用,主要在于背后强大的处理器,其中就包括了<context:annotation-config/>配置项里面的注解所使用的处理器,所以配置了<context:component-scan base-package="">之后,便无需再配置<context:annotation-config>
(五)使用过滤器进行自定义扫描
<?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-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> <context:component-scan base-package="com.mypackage"> <!-- 包含的过滤器 --> <context:include-filter type="regex" expression=".*Stub.*Repository"/> <!-- 排除的过滤器 --> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> </context:component-scan> </beans>
(六)定义Bean
扫描过程中组件被自动检测,那么Bean名称事由BeanNameGenerator生成的(@Component,@Repository,@Service,@Controller都会有个name属性用于显式设置Bean Name)
@Component("exampleBean") public class ExampleBean{ //........ } ------------------------------ @Service("exampleBean") public class ExampleBean{ //........ } ------------------------------ //虽然并未显式声明,但会根据BeanNameGenerator自动生成,规则:以类名为基础,类名第一个字母小写 @Repository public class ExampleBean{ //........ }
可自定义bean命名策略,实现BeanNameGenerator接口,并一定要包含一个无参构造器
<!-- 自定义的命名规则,例如: 类名全小写,全大写.....;按照自己的方式实现--> <context:component-scan base-package="com.mypackage" name-generator="com.mypackage.MyBeanNameGenerator"> </context:component-scan>
(七)作用域
通常情况下自动查找的Spring组件,其Scope是singleton,Spring提供了一个标识scope的注解@Scope
@Scope("prototype") @Repository public class OneInterfaceImpl extends OneInterface { //.......... }
也可以自定义scope策略,实现ScopeMetadataResolver接口,并提供一个无参的构造器
<context:component-scan base-package="com.mypackage" scope-resolver="com.mypackage.MyScopeMetadataResolver"> </context:component-scan>
(八)代理方式
可以使用scope-proxy属性指定代理,有三个值可选:no,interfaces,targetClass
<context:component-scan base-package="com.mypackage" scoped-proxy="interfaces">
</context:component-scan>
Spring学习(5)---Bean的定义及作用域的注解实现
标签:
原文地址:http://www.cnblogs.com/JsonShare/p/4609913.html