Spring学习(5)---Bean的定义及作用域的注解实现

本文内容纲要:Spring学习(5)---Bean的定义及作用域的注解实现

Bean管理的注解实现

  • Classpath扫描与组件管理
  • 类的自动检测与注册Bean
  • context:annotation-config/
  • @Component,@Repository,@Service,@Controller

以下单独讲解:

  • @Required
  • @Autowired
  • @Qualifier
  • @Resource

(一) Classpath扫描与组件管理

  • 从Spring3.0开始,Spring javaConfig项目提供了很多特性,包括使用java而不是xml定义bean,比如:@Configuration,@Bean,@Import,@DependsOn
  • @Component是一个通用的注解,可用于任何的bean
  • @Repository,@Service,@Controller是更有针对性的注解

- @Repository 通常用于注解DAO类,即持久层

- @Service 通常用于注解 Service类,即服务层

- @Controller 通常用于注解Controller类,即控制层

  • @Component是所有受Spring管理组件的通用形式,Spring还提供了更加细化的注解形式:@Repository、@Service、@Controller,它们分别对应持久层Bean,服务层Bean,和控制层Bean。这些注解与@Component的语义是一样的,完全通用,为了给它们追加更多的语义。所以,推荐使用@Repository、@Service、@Controller来替代@Component。

(二) 类的自动检测及Bean的注册

Spring可以自动检测类并注册Bean到ApplicationContext中

(三) context:annotation-config/

  • 通常在基于XML的Spring配置如下标签(请注意包含上下文命名空间)

  • context:annotation-config/仅会查找在同一个applicationContext中的bean注解

    <context:annotation-config/>

(四)类的自动检测及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

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

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

  • 可以通过过滤器修改上面的行为,如:下面例子的xml配置忽略所有的@Repository注解并用“Stub”代替

    <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>

  • 还可以使用use-default-filters="false" 禁用自动发现并注册

(六)定义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的定义及作用域的注解实现

原文链接:https://www.cnblogs.com/JsonShare/p/4609913.html

以上是 Spring学习(5)---Bean的定义及作用域的注解实现 的全部内容, 来源链接: utcz.com/z/362427.html

回到顶部