文档章节

Spring中Bean的定义及作用域的注解实现

刘春辉
 刘春辉
发布于 2014/12/14 16:25
字数 750
阅读 329
收藏 20

Classpath扫描与组件管理:

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

@Configuration,@Bean ,@Import ,@DependsOn

@Component是一个通用注解,可用于任何bean

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

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

@Controller:通常用于Controller类,即控制层MVC

元注解(Meta-annotations)

元注解即注解的注解,许多Spring提供的注解可以作为自己的代码,即"元数据注解",元注解是一个简单的注解,可以应用到另一个注解

下列定义Service注解时,用@Component注解来修饰,@Service拥有@component注解的功能:

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component  // Spring will see this and treat @Service in the same way as @Component
public @interface Service {
    // ....
}

我们也可以自己定义注解.

类的自动检测及Bean的注册

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

例:@Service,@Component,@Repository要注册到类上(类的注解),还有注册在方法上的注解像@Autowired,这些注解可以被自动检测到的

注册在类上的,则可以作为Bean自动注册到ApplicationContext中去

为了能够检测这些类并注册相应的Bean,需要在xml文件中配置下面内容:

<context:component-scan base-package="org.example" />

自动扫描org.example包下面的类

<context:component-scan>包含<context:annotation-config>,通常在使用前者后,就不再使用后者.因为使用前者后,已经包含后者的全部功能.通常使用前者

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

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

可以通过过滤器修改上面的行为.

如:忽略所有的@Repository注解并用"Stub"代替

<beans>
    <context:component-scan base-package="org.example">  
        <context:include-filter type="regex" expression=".*Stub.*Repository" />
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" />
    </context:component-scan>
</beans>

type类型:annotation基于注解,assignable基于类或接口,aspectj基于aspectj,regex基于正则表达式,custom基于自定义

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

定义Bean

扫描过程中组件被自动检测,那么Bean名称是由BeanNameGenerator生成的(@Component,@Repository,@Service,@Controller都会有个name属性用于显示设置Bean Name)

@Service("myMovieLister")
public class SimpleMovieLister {
    // ....
}

也可以自己生成Bean名称,Bean名称为类名的第一个字母小写.

也可以自定义bean命名策略,实现BeanNameGenetator接口,并一定要包含一个无参数构造器

<beans>
    <context:component-scan base-package="org.example" name-generator="org.example.MyNameGenerator" />
</beans>

name-generator="org.example.MyNameGenerator"
指定命名规则的实现

作用域

可用注解@Scope来指明作用域

也可以自定义scope策略,实现ScopeMetadataResolver接口并提供一个无参构造器

<beans>
    <context:component-scan base-package="org.example" scope-resolver="org.example.MyNameGenerator" />
</beans>

代理方式

可以使用scoped-proxy属性指定代理,有三个值可选:no,interfaces,targetClass

<beans>
    <context:component-scan base-package="org.example" scoped-proxy="interfaces" />
</beans>



© 著作权归作者所有

刘春辉
粉丝 4
博文 18
码字总数 5952
作品 0
淄博
程序员
私信 提问
Spring温故而知新 - bean的装配

按条件装配bean 就是当满足特定的条件时Spring容器才创建Bean,Spring中通过@Conditional注解来实现条件化配置bean package com.sl.ioc;import org.springframework.context.annotation.Bean;...

Java-老刘
2018/05/07
90
0
《Spring5学习》 01 装配Bean之自动化装配

Spring的自动化装配就便利性方面远远优于其他装配方法,这也是业界目前主要采用的Bean装配机制。Spring基于组建扫描和自动装配实现自动化装配,能将用户的显示配置降到最低。以下通过一段代码...

老韭菜
2018/08/05
125
0
Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义

1.从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以取代XML配置文件。开发人员对注...

李长春
2011/10/08
1K
0
架构师面试集锦之spring面试题

  大家可以关注一下我 记得点个赞 之后还会更新更多的面试集锦 有自己原创也有借鉴别的大牛的大作   选择使用Spring框架的原因?   使用Spring: 第一是使用它的IOC功能,在解耦上达到了...

Java高级进阶架构师
09/06
0
0
spring梳理(二) 基于注解的方式注册bean

我们知道,如果想要将bean交由spring容器管理,就需要首先将bean注册在spring容器中,而bean可以通过xml或者注解的方式进行注册,基于xml的配置一般是通过、等xml标签进行配置,然后由sprin...

wyn_lin
2018/05/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊nacos config的deleteConfig

序 本文主要研究一下nacos config的deleteConfig ConfigController nacos-1.1.3/config/src/main/java/com/alibaba/nacos/config/server/controller/ConfigController.java @Controller@Re......

go4it
27分钟前
3
0
面试:原来Redis的五种数据类型底层结构是这样的

关注我,可以获取最新知识、经典面试题以及微服务技术分享   在Redis中会涉及很多数据结构,比如SDS,双向链表、字典、压缩列表、整数集合等等。Redis会基于这些数据结构自定义一个对象系统...

ccww_
32分钟前
4
0
java发送html模板的高逼格邮件

最近做了一个监测k8s服务pod水平伸缩发送邮件的功能(当pod的cpu/内存达到指定阈值后会水平扩展出多个pod、或者指定时间内pod数应扩展到指定数量),一开始写了个格式很low的邮件,像下面这样...

码农实战
46分钟前
10
0
php-fpm配置文件详解/MariaDB密码重置、慢查询日志

来源:https://blog.csdn.net/Powerful_Fy php-fpm主配置文件路径:/usr/local/php-fpm/etc/php-fpm.conf #位于安装php安装目录下的etc/目录中,该文件中最后一行将配置文件指向:include=/...

asnfuy
51分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部