计算机系统应用教程网站

网站首页 > 技术文章 正文

spring5 从xml配置到注解配置

btikc 2024-09-16 12:54:23 技术文章 24 ℃ 0 评论

一 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加入配置类进行测试


本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表