Spring学习笔记之三----基于Annotation的Spring IOC配置
- 使用Annotation 来创建Bean有两种方式
- 在配置类中创建bean(配置类是指标注为@Configuration的类),在配置类中每一个创建bean的方法都应该标注为@Bean,可以在@Bean 这个annotation中指定Bean name,如果没有指定,则默认使用方法的名字;
注意在配置类中一个方法创建的Bean要引用另外一个方法创建的Bean,则直接调用方法即可; - 将Java类标注为 @Component,@Repository,@Service,@Controller中的任何一种;Bean name可以在这些Annotation的构造函数中指定,如果没有指定Bean name,Spring默认将Bean name设置为这个类名(小写首字母):
- @Repository用于装饰持久化层;
- @Service用于装饰服务层;
- @Controller用于装饰控制层;
- 如果某个类不适合上面任何一个,则用@Component装饰;
无论采用以上的何种方法,我们都需要指示Spring IoC Container去Scan这些标注有Annotation的类,具体的方法有:
- 如果你使用的是GenericXMLApplicationContext来创建上下文,那么你需要在XML配置文件中加上:
<context:component-scan base-package="package name" />
注意,<context:component-scan>会隐式的启用<context:annotation-config>;所以使用了<context:component-scan>就没必要指定<context:annotation-config>;你可以指定Scan的时候,排除或加入一些类,通过使用<context:component-scan>的<context:include-filter>和<context:exclude-filter>子节点; - 你还可以使用AnnotationConfigApplicationContext来创建上下文,其scan()方法允许你指定要scan的包;register()方法允许你指定要scan的类;
- 在配置类中创建bean(配置类是指标注为@Configuration的类),在配置类中每一个创建bean的方法都应该标注为@Bean,可以在@Bean 这个annotation中指定Bean name,如果没有指定,则默认使用方法的名字;
- 对于一个通过@Component,@Repository,@Service,@Controller中的一种来定义的Bean,如果它要autowire其他的Bean,则可以在这个bean的字段、setter方法、构造函数或者一个任意的的方法上加上@Autowired;使用@Autowired annotation要注意一下几点:
- 默认情况下,所以标示为@Autowired的property都是Required的,如果Spring找不到一个匹配的bean,则会抛出一个异常;你可以将@Autowired的required属性设置为false;
- 当@Autowired被使用到方法上,或者构造函数上,则Spring会Autowired这个方法或者构造函数所有的参数;
- @Autowired默认是autowire by type
- 如果@Autowired被使用在一个数组字段或者范型集合类型的字段上,则Spring会找到所有匹配类型的bean,并构造成数组或者集合,设置给该字段;
- 如果@Autowired被设置给key类型为String的Map类型的字段上,则Spring会找到所有匹配类型的bean,并将这些bean的bean name作为key,插入到Map中;
- 对于一个Autowire的字段,如果找到多个匹配类型的bean,则Spring会抛出异常;解决的办法有两种:
- 在其中的某一个bean上标记@Primary annotation,表示如果找到多个匹配类型的bean,则这个bean将拥有最高优先级;
- 在这个字段上加上@Qualifier annotation,指定要autowire的bean的名字;
- 如果一个配置类要引用到其它配置类中的bean,则可以在这个配置类上面加上@Import annotation去引用其他的配置类;
- Spring提供了@Scope Annotation去定义bean所在的scope,可以将其和@Bean,@Component,@Repository,@Service,@Controller一起使用;
- 为了引用一个Properties文件中的值,我们需要执行下面三个步骤:
- 在配置类上加上@PropertySource annotation,并指定properties文件的位置;
- 在配置类里创建类型为PropertySourcesPlaceholderConfigurer的bean;
- 在完成了上面两个步骤后,我们就可以使用@Value("${key:default_value}")来引用properties文件中的property;
- 在Spring中,可以使用一个Resource来读取一个外部资源,我们只需要使用@Value将资源的地址以字符串的形式注入到一个Resource的字段中,Spring将使用预注册的ResourceEditor将这个字符串转化为一个Resource对象,并注入到这个字段中;
注意:我们可以使用PropertiesLoaderUtils.loadProperties()方法将一个加载了properties文件的Resource对象转换为Properties对象;
- 为了支持多语言化,我们需要在配置文件中创建一个名为messageSource并且类型是ReloadableResourceBundleMessageSource的Bean,但是创建这个Bean的方法必须标示为static,因为ReloadableResourceBundleMessageSource是一个Bean Post Processor;
- 如果想在Spring Container中的每一个bean的初始化方法被调用之前或者之后执行一些任务,我们有两种方式:
- 如果Bean是在配置文件中被创建的,那么我们可以通过设置@Bean annotation的initMethod和destoryMethod两个属性来实现;
- 如果Bean不是在配置文件中被创建的,那么可以在Bean所在类中用@PostConstruct和@PreDestory来标示初始化方法和析构方法;
- 一般而言,spring context中的所有bean会在Spring Container被启动后立即执行初始化;为了避免某些过渡消耗时间和资源的bean的创建,我们可以将Bean所在的类标示上@Lazy annotation,或者在配置类中将Bean创建的方法标示上@Lazy annotation;
- 如果一个Bean的创建需要依赖自一个或者多个其他Bean的创建,我们需要使用@DependsOn annotation;
- 一个Bean post processor允许Spring Container在所有Bean的初始化方法被调用之前或者之后执行一些任务;比如@Required方法就是被Spring内置的一个Post-processor RequiredAnnotationBeanPostProcessor使用,用于判断Spring Container的所有bean中标示为@Required的属性都已经被设置了值;
如果要创建一个自定义的Bean Post Processor,必须实现BeanPostProcessor接口,并实现两个方法:postProcessBeforeInitialization() and postProcessAfterInitialization(),并将该类标示为@Component annotation即可;注意:postProcessBeforeInitialization()和postProcessAfterInitialization()方法将传入的bean返回,或者返回一个与传入的bean相同类型的实例;
- 如果我们要定义多个Profile,我们需要为每一个Profile创建一个配置类,然后将配置类标注上@Profile annotation,在Profile的构造函数里面可以指定一个或者多个Profile name;
为了从正确的Profile去加载beans,我们需要激活一个或者多个profile,正确的做法是在AnnotationConfigApplicationContext scan某个包之前,调用AnnotationConfigApplicationContext.getEnvironment.setActiveProfiles()方法,你也可以设置默认是的Profile,做法是调用AnnotationConfigApplicationContext.getEnvironment.setDefaultProfiles()方法;
Spring学习笔记之三----基于Annotation的Spring IOC配置的更多相关文章
- Spring学习笔记之四----基于Annotation的Spring AOP编程
你能使用@Aspect annotation将某个Java类标注为Aspect,这个Aspect类里的所有公有方法都可以成为一个Advice,Spring提供了5个Annotation去将某个方法标注 ...
- Spring学习笔记之一----基于XML的Spring IOC配置
1. 在spring配置文件中,如果对一个property进行直接赋值,可使用<value>元素,spring负责将值转化为property指定的类型:也可以直接在property元素上使 ...
- Spring学习笔记--环境搭建和初步理解IOC
Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...
- Spring学习笔记(二) 初探Spring
版权声明 笔记出自<Spring 开发指南>一书. Spring 初探 前面我们简单介绍了 Spring 的基本组件和功能,现在我们来看一个简单示例: Person接口Person接口定义 ...
- Spring学习笔记(1)——初识Spring
一.Spring是什么 通常说的Spring其实指的是Spring Framework,它是Spring下的一个子项目,Spring围绕Spring Framework这个核心项目开发了大 ...
- 【Spring学习笔记-1】Myeclipse下Spring环境搭建
*.hl_mark_KMSmartTagPinkImg{background-color:#ffaaff;}*.hl_mark_KMSmartTagBlueImg{background-color:# ...
- Java框架spring 学习笔记(九):Spring的bean管理(@Required、@Component、@Autowired、@Resource注解)
注解:代码里面特殊的标记,使用注解可以完成相关功能 注解写法:@注解名称(属性名.属性值) @Required 用在set方法上,一旦用了这个注解,那么容器在初始化bean的时候必须要进行set,也就 ...
- Spring学习笔记(7)——Bean的基本配置
先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这样有什么坏处呢?其实很显然的,使用new那么就 ...
- Spring 学习笔记(四):Spring AOP
1 概述 本文主要讲述了AOP的基本概念以及在Spring中AOP的几种实现方式. 2 AOP AOP,即Aspect-Oriented Programming,面向切面编程,与OOP相辅相成.类似的 ...
随机推荐
- STL学习之vector
vector是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像指针一样被操作,由于它的特性我们完全可以将vector看做动态数组. 特点: 1.指定一块如同数组一样的连续存 ...
- 温故而知新 兼容性较强的轮播器superslide.js
官网: http://www.superslide2.com/index.html demo: http://www.superslide2.com/demo.html API: http://www ...
- Sublime 常用插件简介
Sublime 常用插件简介 emmet: 前端必备神器.花个十几分钟学下Emmet语法 ,就可以极大提高web开发者HTML和CSS工作效率啦.一句话,牛逼---必备 CSS3: CSS3语法高 ...
- PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)
1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...
- spawn协程学习
对于IO密集型的程序,一般比较高效的做法是选择异步来实现,因为使用异步的方法更容易写出高效的程序.然而使用异步的话,经验较少的人往往会使自己的程序结构变得很混乱,进而导致程序的可读性变差.记得有人说过 ...
- ArcGIS Server,rest路径输入要素json 格式描述
以下内容只测试了简单线, 在ArcGIS Server 的rest路径下可以对服务进行操作,如Query等,这些操作可以输入json 格式要素描述或运行得到即输出json格式要素描述. 如博客:htt ...
- Self-Host Web API 学习笔记
ASP.NET Web API 不需要 IIS,直接使用控制台程序可以实现. 一.创建一个新的控制台程序,项目名为 HostApi 二.设置目标框架为.NET Framework 4 三.NuGet添 ...
- 精简的javascript下throttle和debounce代码
//频率控制 函数连续调用时,fn 执行频率限定为 1次/waitMs.立即执行1次 function throttle(fn, waitMs) { var lastRun = 0; return f ...
- selenium使用过程中遇到的“element not visiable”错误
PS:本博客selenium分类不会记载selenium打开浏览器,定位元素,操作页面元素,切换到iframe,处理alter.confirm和prompt对话框这些在网上随处可见的信息:本博客此分类 ...
- 升级win8.1后mysql服务不能启动的问题
升级win8.1后发现服务列表中MySQL55不见了. 1. 先把服务恢复. mysql没有看到maitenance,找到安装文件 mysql-installer-community-5.6.12.0 ...