传统的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. yii1的笔记

    $sql = 'SELECT * FROM to8to_worker_item limit 10'; $res = Yii::app()->db->createCommand($sql)- ...

  2. 从零开始制作H5人脸融合小游戏

    去年的建军节,一个展示军装照的H5人脸融合游戏火遍朋友圈,带来很好的传播效果.最近欧冠决赛要来了,公司决定做一个寻找和你最像的欧冠球星的H5游戏,那么该怎么做呢?认真分析了一下,这个游戏其实用到的技术 ...

  3. PHP学习4——面向对象

    主要内容: 创建类 成员方法 构造方法 析构方法 封装 继承 接口 多态 静态成员 常用关键字 常用魔术方法 从PHP5开始引入了面向对象的全部机制,面向对象的特性符合软件工程的3个目标:重用性,灵活 ...

  4. 点击select下拉框,触发事件

    <div class="controls moneycheck floatleft"> <select class="span12 chosen_cat ...

  5. JVM(五) class类文件的结构

    概述 class类文件的结构可见下面这样图(出处见参考资料),可以参照下面的例子,对应十六进制码,找出找出相应的信息. 其中u2 , u4 表示的意思是占用两个字节和占用四个字节,下面我们将会各项说明 ...

  6. Spring mvc 中 DispatcherServlet 的学习和理解

    上图表示当客户请求来到时,spring架构作出响应的流程,可以从图中看到看到请求分发的中心就是 DispatcherServlet 类,DispatcherServlet的任务是将请求发送给Sprin ...

  7. JAVA_SE_Day02 String 的正则表达式

    字符串支持正则表达式的方法一: boolean matches(String regex) 注意: 给定的正则表达式就算不指定边界符(^,$),也会全匹配验证 空字符串和null 空字符串是看不见,而 ...

  8. Win10自带Ubuntu子系统下Mysql安装踩坑记录

    linux系统为win10自带Ubuntu子系统 错误的安装过程 我按照一般的方法安装mysql,安装步骤如下 1.升级源 $ sudo apt-get update 2.安装mysql $ sudo ...

  9. 抽象工厂模式的C++、Java实现

    1.抽象工厂模式UML 图1. 抽象工厂模式的UML 2.C++实现 C++实现类图为: 图2. 抽象工厂模式的C++实现类图 其中,AbstractFactory的实现代码为: //抽象工厂类基类. ...

  10. Activiti学习之HelloWorld程序

    流程图 部署流程定义 /** * 部署流程定义 */ @Test public void deploymentProcessDefinition() { ProcessEngine processEn ...