百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

spring5 从xml配置到注解配置

xsobi 2024-11-24 23:33 1 浏览

一 CAP1章节 将你的工程从XML配置到注解

  • 创建工程
  1. 创建Maven工程:


  2. pom.xml引入spring-context jar和Junit测试用例包

<dependencies>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>5.0.6.RELEASE</version>

</dependency>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.12</version>

<scope>test</scope>

</dependency>

</dependencies>


  1. 如果是以前,我们应该建立spring的beanx.xml



beans.xml内容如下,使用bean标签注册一些组件<新建Person.java>:


3,新建cap1包名,新建Person.java类

4,新建MainTest1测试类:ClassPathXmlApplicationContext:类路径下的XML


如果我们用注解开发, 很明显是不需要XML的


5,注解测试:如何使用注解(去掉配置文件)开发

新建MainConfig类


6,注解测试:新建MainTest2注解测试,用来测试//AnnoatationConfigApplicationContext: 注解配置来获取IOC容器




二 CAP2章节 ComponentScan扫描规则



2.1 操作:新建cap2文件夹,新建Cap2MainConfig.java配置类

作用:指定要扫描的包


1,@ComponentScan(value="com.enjoy.cap2")表示扫描此目录下的包

2,建立测试用例方法;


2.2 新建Cap2MainConfig2配置类

作用:定制包扫描时的过滤规则

新建dao, service,controller


在Cap2MainConfig2加入配置: @Filter: 扫描规则

@ComponentScan(value="com.enjoy.cap2",includeFilters={ @Filter(type=FilterType.ANNOTATION,classes={Controller.class}), @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={BookService.class})

},useDefaultFilters=false) //默认是true,扫描所有组件,要改成false,使用自定义扫描范围

*/

//@ComponentScan value:指定要扫描的包

//excludeFilters = Filter[] 指定扫描的时候按照什么规则排除那些组件

//includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件

//useDefaultFilters = false 默认是true,扫描所有组件,要改成false

//----扫描规则如下

//FilterType.ANNOTATION:按照注解

//FilterType.ASSIGNABLE_TYPE:按照给定的类型;比如按BookService类型

//FilterType.ASPECTJ:使用ASPECTJ表达式

//FilterType.REGEX:使用正则指定

//FilterType.CUSTOM:使用自定义规则,自已写类,实现TypeFilter接口



//FilterType.CUSTOM的例子,常用

先新增自定义过滤规则类:


Cap2MainConfig申明

@ComponentScan(value="com.enjoy.cap2",includeFilters={

@Filter(type=FilterType.CUSTOM,classes={JamesTypeFilters.class})

},useDefaultFilters=false)

public class Cap2MainConfig2 {}


三 CAP3章节 scope扫描规则

1,新建Cap3MainConfig.java


2,没加@Scope之前, 默认的bean是单实例的. 新建 test01()方法测试如下:


返回true, 证明取到的是同一个person bean,只实例化了一次.

3, 加入@Scope(“prototype”) //多实例

prototype: 多实例:IOC容器启动并不会去调用方法创建对象放在容器中,而是 每次获取的时候才会调用方法创建对象,见test02

singleton: 单实例(默认):IOC容器启动会调用方法创建对象放到IOC容器中

以后每交获取就是直接从容器(理解成从map.get对象)中拿

request: 主要针对WEB应用,同一次请求创建一个实例

session: 同一个session创建一个实例(后面两个用得不多,了解即可





四 CAP4章节 lazy懒加载

1,新建Cap4MainConfig.java


2,建立测试用例test01();


当在Cap4MainConfig加入@Lazy时, 只有获取anno.getBean时才会加载到IOC容器中

四 CAP5章节 @Conditional条件注册bean

1,将IOC容器注册bean时, 当操作系统为WINDOWS时,注册Lison实例; 当操作系统为LINUX时, 注册James实例,此时要用得@Conditional注解进行定制化条件选择注册bean;

2,新建Cap7MainConfig1.java,


新建WinCondition.java类作为条件类, 同时必须得实现spring提供的Confition接口


新建 LinuxCondition条件类, 用来处理操作系统为LINUX的bean注册


2, 把IOC容器里的所有person实例名打印出来(为了看效果,刚开始在配置类可以不加@Conditinal)

@Test

public void test01()


3, 新建test02(), 测试@Conditional 条件加载bean到IOC容器(加上@Conditinal)


当引入@Conditional时, 容器可以选择性地注册bean.



五 CAP6章节 @Import注册bean

同样按流程先新建Cap8MainConfig1.java配置类

新建Dog.ava类----->public class Dog {}

新建Cat.java类---->public class Cat{}

按以下1,2,3箭头步骤分别导入多个类,使用import将dog, cat的bean注册到容器中,并测试打印,看容器中是否已加载此类


分别使用

@Import(Dog.class)

@Import({Dog.class,Cat.class})


ImportSelector可以批量导入组件的全类名数组,自定义逻辑返回需要导入的组件JamesImportSelector.java

@Import({Dog.class,Cat.class,JamesImportSelector.class})

新建JamesImportSelector, 新建Fish Tiger类(与建Cat和Dog一样)


怎么测呢?



当然,除了以上,还可以通过ImportBeanDefinitionRegistrar自定义注册,向容器中注册bean;

@Import({Dog.class,Cat.class,JamesImportSelector.class,JamesImportBeanDefinitionRegistrar.class})

新建JamesImportBeanDefinitionRegistrar自定义注册类,实现bean注册


当然除了以上加载方式,还可以通过实现FactoryBean接口方式来加载bean

* 使用spring提供的FactoryBean(工厂bean)

* beans.factory.FatoryBean源码跟进去

* 容器调用getObject()返回对象,把对象放到容器中;

* getObjectType()返回对象类型

* isSingleton()是否单例进行控制

* 新建JamesFactoryBean实现FactoryBean

* 在config里新建jamesFactoryBean()方法

* 写完test03测试用例后:

* a,默认获取到的是工厂bean调用getObject创建的对象

* b,要获取工厂Bean本身,需要在id前加个 &jamesFactoryBean

*/


把自定义的JamesImportBeanDefinitionRegistrar加入配置类进行测试


相关推荐

js向对象中添加元素(对象,数组) js对象里面添加元素

一、添加一个元素对象名["属性名"]=值(值:可以是一个值,可以是一个对象,也可以是一个数组)这样添加进去的元素,就是一个值或对象或数组...

JS小技巧,如何去重对象数组?(一)

大家好,关于数组对象去重的业务场景,想必大家都遇到过类似的需求吧,这对这样的需求你是怎么做的呢。下面我就先和大家分享下如果是基于对象的1个属性是怎么去重实现的。方法一:使用.filter()和....

「C/C++」之数组、vector对象和array对象的比较

数组学习过C语言的,对数组应该都不会陌生,于是这里就不再对数组进行展开介绍。模板类vector模板类vector类似于string,也是一种动态数组。能够在运行阶段设置vector对象的长度,可以在末...

如何用sessionStorage保存对象和数组

背景:在工作中,我将[{},{}]对象数组形式,存储到sessionStorage,然后ta变成了我看不懂的形式,然后我想取之用之,发现不可能了~记录这次深刻的教训。$clickCouponIndex...

JavaScript Array 对象 javascript的array对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

JavaScript中的数组Array(对象) js array数组

1:数组Array:-数组也是一个对象-数组也是用来存储数据的-和object不同,数组中可以存储一组有序的数据,-数组中存储的数据我们称其为元素(element)-数组中的每一个元素都有一...

数组和对象方法&amp;数组去重 数组去重的5种方法前端

列举一下JavaScript数组和对象有哪些原生方法?数组:arr.concat(arr1,arr2,arrn);--合并两个或多个数组。此方法不会修改原有数组,而是返回一个新数组...

C++ 类如何定义对象数组?初始化数组?linux C++第43讲

对象数组学过C语言的读者对数组的概念应该很熟悉了。数组的元素可以是int类型的变量,例如int...

ElasticSearch第六篇:复合数据类型-数组,对象

在ElasticSearch中,使用JSON结构来存储数据,一个Key/Value对是JSON的一个字段,而Value可以是基础数据类型,也可以是数组,文档(也叫对象),或文档数组,因此,每个JSON...

第58条:区分数组对象和类数组对象

示例设想有两个不同类的API。第一个是位向量:有序的位集合varbits=newBitVector;bits.enable(4);bits.enable([1,3,8,17]);b...

八皇后问题解法(Common Lisp实现)

如何才能在一张国际象棋的棋盘上摆上八个皇后而不致使她们互相威胁呢?这个著名的问题可以方便地通过一种树搜索方法来解决。首先,我们需要写一个函数来判断棋盘上的两个皇后是否互相威协。在国际象棋中,皇后可以沿...

visual lisp修改颜色的模板函数 怎么更改visual studio的配色

(defunBF-yansemokuai(tuyuanyanse/ss)...

用中望CAD加载LISP程序技巧 中望cad2015怎么加载燕秀

1、首先请加载lisp程序,加载方法如下:在菜单栏选择工具——加载应用程序——添加,选择lisp程序然后加载,然后选择添加到启动组。2、然后是添加自定义栏以及图标,方法如下(以...

图的深度优先搜索和广度优先搜索(Common Lisp实现)

为了便于描述,本文中的图指的是下图所示的无向图。搜索指:搜索从S到F的一条路径。若存在,则以表的形式返回路径;若不存在,则返回nil。...

两个有助于理解Common Lisp宏的例子

在Lisp中,函数和数据具有相同的形式。这是Lisp语言的一个重大特色。一个Lisp函数可以分析另一个Lisp函数;甚至可以和另一个Lisp函数组成一个整体,并加以利用。Lisp的宏,是实现上述特色的...