一 CAP1章节 将你的工程从XML配置到注解
- 创建工程
- 创建Maven工程:
- 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>
- 如果是以前,我们应该建立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加入配置类进行测试
本文暂时没有评论,来添加一个吧(●'◡'●)