spring5 从xml配置到注解配置

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

  • 创建工程
  1. 创建Maven工程:
  2.  
  3.  
  4. 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类

spring5 从xml配置到注解配置

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

spring5 从xml配置到注解配置

 

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

 

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

新建MainConfig类

 

spring5 从xml配置到注解配置

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

 

 

spring5 从xml配置到注解配置

 

二 CAP2章节  ComponentScan扫描规则

 

 

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

作用:指定要扫描的包

  spring5 从xml配置到注解配置

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

2,建立测试用例方法;

 

spring5 从xml配置到注解配置

2.2 新建Cap2MainConfig2配置类

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

新建dao, service,controller

 

spring5 从xml配置到注解配置

spring5 从xml配置到注解配置

spring5 从xml配置到注解配置

在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接口

spring5 从xml配置到注解配置

 

 

//FilterType.CUSTOM的例子,常用

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

 

Cap2MainConfig申明

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

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

},useDefaultFilters=false)

public class Cap2MainConfig2 {}

spring5 从xml配置到注解配置

 

三 CAP3章节  scope扫描规则

1,新建Cap3MainConfig.java

 

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

 

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

spring5 从xml配置到注解配置

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

spring5 从xml配置到注解配置

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

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

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

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

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

 

 

 

 

四 CAP4章节  lazy懒加载

1,新建Cap4MainConfig.java

spring5 从xml配置到注解配置

 

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

 

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

spring5 从xml配置到注解配置

四 CAP5章节  @Conditional条件注册bean

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

2,新建Cap7MainConfig1.java,

spring5 从xml配置到注解配置

 

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

spring5 从xml配置到注解配置

 

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

spring5 从xml配置到注解配置

 

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

 @Test

 public void test01()

spring5 从xml配置到注解配置

 

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

spring5 从xml配置到注解配置

 

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

 

 

五 CAP6章节  @Import注册bean

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

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

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

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

spring5 从xml配置到注解配置

 

分别使用 

@Import(Dog.class)   

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

 

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

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

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

spring5 从xml配置到注解配置

 

怎么测呢?

spring5 从xml配置到注解配置

 

 

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

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

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

spring5 从xml配置到注解配置

 

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

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

 *   beans.factory.FatoryBean源码跟进去

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

 *     getObjectType()返回对象类型

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

 *     新建JamesFactoryBean实现FactoryBean

 *     在config里新建jamesFactoryBean()方法

 *     写完test03测试用例后:

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

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

 */

 

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

 

spring5 从xml配置到注解配置

spring5 从xml配置到注解配置