传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:
1、如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低。
2、在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率。
为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。

所有的注解都是在一个工程中进行演示、后面不懂得可以参考前面的随笔!

开始注解的代码编程:

1.工程准备
Person.class
public class Person {
private String name;
private int age;
...
}
配置类:
Config.class
//配置类 === 配置文件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=]
 
 
1.@Configuration
告诉sprin该类是一个配置类
所谓的配置类相当于我们所写的xxx.xml配置文件
 
2.@Bean
给容器中注入一个Bean,相当于<bean></bean>进行实例化一个bean
 
属性:
默认value可以不写

 

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 :指定扫描的适合排除那些包

    Filter[] excludeFilters() default {};
         FilterType type() default FilterType.ANNOTATION;
              Class<?>[] classes() default {};

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;
}
}
在测试打印的时候
这些都是className中打印出来的
扫描到的类
--->coom.MrChengs.config.conteoller.CustomerConteoller
--->coom.MrChengs.config.dao.CustomerDao
--->coom.MrChengs.config.MyTypeFilter
--->coom.MrChengs.config.service.CustomerService
return true的时候
当然我们可以进行系统的判断进行放行
config
customerConteoller
customerDao
myTypeFilter
customerService
可以把所有的@ComponentScan都写在里面
@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
     //prototype  多实例的    在IOC容器创建之后获取对象才开始创建,获取一次创建一次
     //singleton  单例的   IOC容器启动的时候就会调用对象放到IOC容器中,多次获取也是只获取同一个
     //request   同一次请求
     //session   同一个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的更多相关文章

  1. 阶段3 2.Spring_06.Spring的新注解_1 spring的新注解-Configuration和ComponentScan

    解决测试类重复代码的问题,xml还是存在的问题,没法脱离xml文件 要想在QueryRunner上加注解,是加不了的 创建工程 复制依赖项到pom.xml 复制注解的工程里面的com文件夹 配置文件b ...

  2. [转]Spring注解-@Configuration注解、@Bean注解以及配置自动扫描、bean作用域

    1.@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文) package com.test.s ...

  3. Spring注解-@Configuration注解、@Bean注解以及配置自动扫描、bean作用域

    1.@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文) package com.test.s ...

  4. Spring学习(13)--- 基于Java类的配置Bean 之 @Configuration & @Bean注解

    基于Java配置选项,可以编写大多数的Spring不用配置XML,但有几个基于Java的注释的帮助下解释.从Spring3.0开始支持使用java代码来代替XML来配置Spring,基于Java配置S ...

  5. SpringBoot的注解:@SpringBootApplication注解 vs @EnableAutoConfiguration+@ComponentScan+@Configuration

    spring Boot开发者经常使用@Configuration,@EnableAutoConfiguration,@ComponentScan注解他们的main类, 由于这些注解如此频繁地一块使用( ...

  6. spring注解开发:Configuration&Bean

    1.使用xml创建bean的方式 1.首先新建一个maven工程,添加如下依赖 <dependency> <groupId>org.springframework</gr ...

  7. springboot @Configuration @bean注解作用

    @Configuration注解可以达到在Spring中使用xml配置文件的作用 @Bean就等同于xml配置文件中的<bean> 在spring项目中我们集成第三方的框架如shiro会在 ...

  8. 学习 Spring (八) 注解之 Bean 的定义及作用域

    Spring入门篇 学习笔记 Classpath 扫描与组件管理 从 Spring 3.0 开始,Spring JavaConfig 项目提供了很多特性,包括使用 java 而不是 XML 定义 be ...

  9. Spring中注解注入bean和配置文件注入bean

    注解的方式确实比手动写xml文件注入要方便快捷很多,省去了很多不必要的时间去写xml文件 按以往要注入bean的时候,需要去配置一个xml,当然也可以直接扫描包体,用xml注入bean有以下方法: & ...

  10. 002-Spring4 快速入门-项目搭建、基于注解的开发bean,Bean创建和装配、基于注解的开发bean,Bean初始化销毁、Bean装配,注解、Bean依赖注入

    一.项目搭建 1.项目创建 eclipse→project explorer→new→Project→Maven Project 默认配置即可创建项目 2.spring配置 <dependenc ...

随机推荐

  1. jQuery插件 -- UI插件Tabs Widget 1.10

    最近将tabs(标签页)整合到Admin LTE( 一个完全响应式管理模板,基于Bootstrap3的框架.)中使用.过程中走了不少弯路,原因是没有注意版本问题,jquery ui tabs 每次升级 ...

  2. SZU2

    CF:Problem 425A 区间暴力,枚举区间.交换选定区间最小值和剩余区间最大值k次. 其实等同于将剩余区间最大k个加到选定区间里,然后排序 #include <iostream> ...

  3. VueJS开发所用到的技术栈

    1. 主要使用vue.js2. 使用vue-cli脚手架搭建项目3. 使用vue-router来做路由,实现单页面跳转4. 使用iView UI作为前端UI框架,Mouse UI作为手机端UI框架5. ...

  4. C语言转置矩阵算法

    对一个nxn阶的矩阵进行转置,算法如下: #include <stdio.h> #define n 3 void MM(int a[][n]) { int i,j,temp; ;i < ...

  5. 轻松看懂机器学习十大常用算法 (Machine Learning Top 10 Commonly Used Algorithms)

    原文出处: 不会停的蜗牛    通过本篇文章可以对ML的常用算法有个常识性的认识,没有代码,没有复杂的理论推导,就是图解一下,知道这些算法是什么,它们是怎么应用的,例子主要是分类问题. 每个算法都看了 ...

  6. OpenfileDialog选择照片的简单应用

    OpenFileDialog openFileDlg = new OpenFileDialog(); openFileDlg.Title = "选择文件"; openFileDlg ...

  7. myeclipse 下载 checkstyle 引入后不显示问题

    参照这篇博客,http://blog.csdn.net/zzq900503/article/details/42003499 下载最新的checkstyle版本后,在本地导入后一直不显示,步骤什么的也 ...

  8. Java—IO流 字符流

    java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码). 文件是byte byte byte ... 的数据序列. 文本文件是文本(char)序列按照某种编码方案(uf ...

  9. 故障排除:无法启动、访问或连接到 Azure 虚拟机上运行的应用程序

    有多种原因可导致无法启用或连接到在 Azure 虚拟机 (VM) 上运行的应用程序.原因包括应用程序未在预期端口上运行或侦听.侦听端口受到阻止,或网络规则未将流量正确传递到应用程序.本文说明有条理地找 ...

  10. [问题记录]libpomelo编译报错:ssize_t重定义

    1. 时间:2015/01/16 描述:添加libpomelo到cocos2dx项目,报错如下图所示: 解决: 修改代码,源代码: #if !defined(_SSIZE_T_) && ...