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注解
<?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>
(五)使用过滤器进行自定义扫描
- 默认情况下,类被自动发现并注册bean的条件是:使用@Component,@Repository,@Service,@Controller注解或者使用@Component的自定义注解
- 可以通过过滤器修改上面的行为,如:下面例子的xml配置忽略所有的@Repository注解并用“Stub”代替
<?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>
- 还可以使用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的定义及作用域的注解实现的更多相关文章
- Spring学习九----------Bean的配置之Bean的定义及作用域的注解实现
© 版权声明:本文为博主原创文章,转载请注明出处 Spring Bean常用注解 @Component:通常注解,可用于任何Bean @Repository:通常用于注解DAO层,即持久层 @Serv ...
- Bean的定义及作用域的注解实现
1. Classpath扫描与组件管理 从Spring3.0开始,Spring JavaConfig项目提供了很多特性,包括使用java而不是XML定义bean. 比如@configuration, ...
- spring 学习之 bean 的注入方式 property和constructor-arg的使用方式
spring 学习之 bean 的注入方式 property和constructor-arg的使用方式. bean的注入方式: property 注入是: 通过setxx方法注入. construct ...
- 学习 Spring (八) 注解之 Bean 的定义及作用域
Spring入门篇 学习笔记 Classpath 扫描与组件管理 从 Spring 3.0 开始,Spring JavaConfig 项目提供了很多特性,包括使用 java 而不是 XML 定义 be ...
- Spring Bean的定义及作用域
目录: 了解Spring的基本概念 Spring简单的示例 Bean的定义 简单地说Bean是被Spring容器管理的Java对象,Spring容器会自动完成对Bean的实例化. 那么什么是容器呢?如 ...
- Spring 学习笔记 Bean的作用域
在配置文件中定义Bean时,用户不但可以配置Bean的属性值以及相互之间的依赖关系,还可以定义Bean的作用域.作用域将对Bean的生命周期和创建方式产生影响.在低版本的Spring中,仅有两个作用域 ...
- Spring 学习之bean的理解
前言:对于使用Spring框架的开发人员来说,我们主要做的主要有两件事情:①开发Bean;②配置Bean;而Spring帮我们做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法来完成“依 ...
- 理解Spring框架中Bean的5个作用域
当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring I ...
- Spring-Context之四:Spring容器及bean的定义
Spring框架的核心功能之一就是控制反转(Inversion of Control, IoC),也叫做依赖注入(dependency injection, DI).关于依赖注入的具体内容可以参见Ma ...
随机推荐
- Jquery遍历数组之$().each()方法和$.each()方法
前几天面试碰到了一个笔试问题:用jquery变了数组. 总结一下用jquery遍历数组的两种方法: 一.$().each()方法 <head><meta http-equiv=&qu ...
- xmlplus 组件设计系列之二 - 按钮
除了图标以外,按钮也许是最简单的组件了,现在来看看如何定义按钮组件. 使用原生按钮组件 在 xmlplus 中,HTML 元素也以组件的方式存在.所以,你可以直接通过使用 button 标签或者 in ...
- 关于dom脚本编程的一些优秀理念总结
1.平稳退化(优雅降级) 目的:当浏览器不支持js或者js被用户禁用时,做到即使不运行js,网页的可读性亦不会受到太大的影响. 理念:使用最新的技术面向高级浏览器构建最强的功能及用户体验,然后针对低级 ...
- hdu3336 kmp
It is well known that AekdyCoin is good at string problems as well as number theory problems. When g ...
- phpcms页面替换
首页的替换流程首先要先把静态网页做出来,拿到这里来: 会发现这个网页里面少了图片,样式表也没有了 因为我们只把网页扔过来,所对应的图片和样式表没有扔过来 图片什么的应该扔到: 接着打开index.ht ...
- Redux-saga
Redux-saga学习笔记 概述 Redux-saga在Redux应用中扮演'中间件'的角色,主要用来执行数据流中的异步操作.主要通过ES6中的generator函数和yield关键字来以同步的方式 ...
- jQuery选择器的分类之过滤选择器
jQuery选择器的分类之过滤选择器 上一篇文章为大家简单呢的介绍了jQuery选择器中的基本选择器,层级选择器,表单选择器,接下来就带大家了解一下过滤选择器... 过滤选择器都分为哪些??? 1.基 ...
- 自己实现的一个简单的EF框架(反射实现)
我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一 ...
- SQL server 用命令行更改数据库
(计应154兰家才) CREATE DATABASE 数据库名 ON [PRIMARY] ( <数据文件参数> [,…n] [<文件组参数>] ) [LOG ON] ( ...
- liunx命令3
liunx系统目录结构 / /home /root /dev /usr /etc/ /boot /lib /var /tmp /proc /bin /sbin / 通常称为根分区,所有的文件和目录的起 ...