1spring注解:@Configuration,@Bean,@ComponentScan(),@Scope
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:
1、如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低。
2、在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率。
为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。
所有的注解都是在一个工程中进行演示、后面不懂得可以参考前面的随笔!
开始注解的代码编程:
public class Person {
private String name;
private int age;
...
}
//配置类 === 配置文件xxx.xml
//@Configuration是告诉Spring这是一个配置类
@Configuration
public class Config { //给容器注册一个bean,相当于配置文件的 <bean></bean>
//类型默认是返回的类型
//id默认是方法名
@Bean("per")
public Person person(){
return new Person("MrChengs",);
}
}
测试:
ApplicationContext app = new AnnotationConfigApplicationContext(Config.class);
Person p =app.getBean(Person.class);
System.out.println(p);
Person [name=MrChengs, age=]

3.@ComponentScan()
等同于:<context:component-scan base-package=""></context:component-scan>
新建四个类,分别使用:@Repository,@Service,@Controller三个注解
@Repository
public class CustomerDao {
}
@Service
public class CustomerService {
}
@Controller
public class CustomerConteoller {
}
在Config.class类中
@Configuration
@ComponentScan(value="coom.MrChengs.config",excludeFilters={
@Filter(type=FilterType.ANNOTATION,classes={Repository.class})})
public class Config { @Bean("per")
public Person person(){
return new Person("MrChengs",);
}
}
@ComponentScan:
value :指定需要扫描的包
excludeFilters :指定扫描的适合排除那些包
includeFilters: 指定扫描的时候只包含那些包
在使用的时候需要添加:useDefaultFilters=false属性
其余属性和excludeFilters类似
@Test
public void test(){
ApplicationContext app = new AnnotationConfigApplicationContext(Config.class);
//获取bean的name
String [] names = app.getBeanDefinitionNames();
for(String name : names){
System.out.println(name);
}
}
config
customerConteoller
customerService
per
关于@Filter的使用:
.type=FilterType.ANNOTATION: 是根据注解的规则
.type=FilterType.ASSIGNABLE_TYPE:按照给定的类型
@Filter(type=FilterType.ASSIGNABLE_TYPE,classes=CustomerService.class
.type=FilterType.ASPECTJ:使用aspectj表达式
.type=FilterType.REGEX:使用正则表达式
.type=FilterTyoe.CUSTOM:自定义规则
使用5进行测试:
@ComponentScan(value="coom.MrChengs.config",includeFilters={
@Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class}),
},useDefaultFilters=false)
public class MyTypeFilter implements TypeFilter{
//MetadataReader:读取到当前正在扫描的包信息
//MetadataReaderFactory:可以获取到其他类的任何信息
public boolean match(MetadataReader arg0, MetadataReaderFactory arg1) throws IOException {
//获取当前类的注解信息
AnnotationMetadata annotationMetadata =arg0.getAnnotationMetadata();
//获取当前正在扫描类的信息
ClassMetadata classMetadata = arg0.getClassMetadata();
//获取当前类的资源(路径,url...)
Resource resource = arg0.getResource();
//获取类的全类名
//扫描到的类
String className = classMetadata.getClassName();
System.out.println("--->" + className);
return false;
}
}
--->coom.MrChengs.config.conteoller.CustomerConteoller
--->coom.MrChengs.config.dao.CustomerDao
--->coom.MrChengs.config.MyTypeFilter
--->coom.MrChengs.config.service.CustomerService
config
customerConteoller
customerDao
myTypeFilter
customerService
@ComponentScans(value={@ComponentScan(value="coom.MrChengs.config",excludeFilters={
@Filter(type=FilterType.ANNOTATION,classes={Repository.class})})}
)
4.@Scope 调整作用域
Config2.java
@Configuration
public class Config2 { @Bean("per")
public Person person(){
return new Person("MrChengs",);
}
}
测试
@Test
public void test2(){
ApplicationContext app = new AnnotationConfigApplicationContext(Config2.class);
String [] names = app.getBeanDefinitionNames();
for(String name : names){
System.out.println(name);
}
Person p = (Person) app.getBean("per");
Person p1 = (Person) app.getBean("per");
System.out.println(p == p1); }
config2
per
true
说明默认是单实例的,只实例化一个bean
@Scope
* @see ConfigurableBeanFactory#SCOPE_PROTOTYPE
* @see ConfigurableBeanFactory#SCOPE_SINGLETON
* @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
* @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
@Configuration
public class Config2 {
//prototype 多实例的
//singleton 单例的
//request
//session
@Scope(value="prototype")
@Bean("per")
public Person person(){
return new Person("MrChengs",);
}
}
config2
per
false
多实例情况下,获取一次则创建一个实例
1spring注解:@Configuration,@Bean,@ComponentScan(),@Scope的更多相关文章
- 阶段3 2.Spring_06.Spring的新注解_1 spring的新注解-Configuration和ComponentScan
解决测试类重复代码的问题,xml还是存在的问题,没法脱离xml文件 要想在QueryRunner上加注解,是加不了的 创建工程 复制依赖项到pom.xml 复制注解的工程里面的com文件夹 配置文件b ...
- [转]Spring注解-@Configuration注解、@Bean注解以及配置自动扫描、bean作用域
1.@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文) package com.test.s ...
- Spring注解-@Configuration注解、@Bean注解以及配置自动扫描、bean作用域
1.@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文) package com.test.s ...
- Spring学习(13)--- 基于Java类的配置Bean 之 @Configuration & @Bean注解
基于Java配置选项,可以编写大多数的Spring不用配置XML,但有几个基于Java的注释的帮助下解释.从Spring3.0开始支持使用java代码来代替XML来配置Spring,基于Java配置S ...
- SpringBoot的注解:@SpringBootApplication注解 vs @EnableAutoConfiguration+@ComponentScan+@Configuration
spring Boot开发者经常使用@Configuration,@EnableAutoConfiguration,@ComponentScan注解他们的main类, 由于这些注解如此频繁地一块使用( ...
- spring注解开发:Configuration&Bean
1.使用xml创建bean的方式 1.首先新建一个maven工程,添加如下依赖 <dependency> <groupId>org.springframework</gr ...
- springboot @Configuration @bean注解作用
@Configuration注解可以达到在Spring中使用xml配置文件的作用 @Bean就等同于xml配置文件中的<bean> 在spring项目中我们集成第三方的框架如shiro会在 ...
- 学习 Spring (八) 注解之 Bean 的定义及作用域
Spring入门篇 学习笔记 Classpath 扫描与组件管理 从 Spring 3.0 开始,Spring JavaConfig 项目提供了很多特性,包括使用 java 而不是 XML 定义 be ...
- Spring中注解注入bean和配置文件注入bean
注解的方式确实比手动写xml文件注入要方便快捷很多,省去了很多不必要的时间去写xml文件 按以往要注入bean的时候,需要去配置一个xml,当然也可以直接扫描包体,用xml注入bean有以下方法: & ...
- 002-Spring4 快速入门-项目搭建、基于注解的开发bean,Bean创建和装配、基于注解的开发bean,Bean初始化销毁、Bean装配,注解、Bean依赖注入
一.项目搭建 1.项目创建 eclipse→project explorer→new→Project→Maven Project 默认配置即可创建项目 2.spring配置 <dependenc ...
随机推荐
- vue加载Element ui地址省市区插件-- element-china-area-data
1.安装 npm install element-china-area-data -S 2.使用(引入) import { provinceAndCityData, regionData, provi ...
- JavaEE之动态页面技术(JSP/EL/JSTL)
动态页面技术(JSP/EL/JSTL) JSP技术 jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%= ...
- [摘]全文检索引擎Solr系列—–全文检索基本原理
原文链接--http://www.importnew.com/12707.html 全文检索引擎Solr系列—–全文检索基本原理 2014/08/18 | 分类: 基础技术, 教程 | 2 条评论 | ...
- Python入门-内置函数二
看到标题你也能猜到今天要说大概内容是什么了,没错,昨天没有说完的部分再给大家说说(有一些重合的部分),内置函数的内容比较多,并且工作中经常用到的却不太多,很多都是不太常用的,所以我就着重说一些比较常用 ...
- canvas合成图片 圣诞节新技能戴帽
<!doctype html><html><head><meta charset="utf-8"><title>Html ...
- Linux系统搭建GitLab---阿里云Centos7搭建Gitlab踩坑
一.简介 GitLab,是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目安装. 它拥有与GitHub类似的功能,能 ...
- Win7下VC++6.0打开文件报错导致其崩溃的解决办法
原文:http://blog.csdn.net/wanghaihao_1/article/details/39005771 在Windows7下安装Visual C++ 6.0后,遇到一个致命的问题打 ...
- 【Python】卸载完Python3 之后 Python2 无法打开IDLE
安装官方的Python带Idle但是却无法打开,百度谷歌了几种解决方法,加上自己的实际境况予以解决. 我的python是直接安装在C盘下的. 1.首先是设置环境变量: Path=C:\Python27 ...
- restful知识点之二restframework视图
restful协议理解:面向资源开发 restful协议 ---- 一切皆是资源,操作只是请求方式 ----book表增删改查 /books/ books /books/add/ addbook /b ...
- freess(未测试)
freess 使用 nodejs 配合 shadowsocks-windows 实现FQ (windows) 使用方法: 如果你没有安装nodejs请先安装,访问 https://nodejs.org ...