一:使用@Configuration和@Bean等组件替代xml方式将bean对象添加到spring容器中
- 创建一个实体类
- 创建配置类
注解解释:
@Configuration:这个注解是告诉spring这是一个配置类,相当于xml文件
@Bean:给容器注册一个Bean,类型为返回值的类型,bean对象的id名称默认为方法名,
也可以自定义bean的id名称,例如:@Bean("person02"),那么这个Person对象
的id名称就是person02 - 测试类MainTest
⑴通过类型获取bean对象
注意:AnnotationConfigApplicationContext:可以实现基于Java的配置类加载Spring的应用上下文
效果:
⑵ 通过id名称获取bean对象
效果:
⑶通过类型获取bean的id名称,然后通过id名称获取bean对象
效果:
二:自动扫描组件之@ComponentScan
- 简介
@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中。 - 下面我们创建web,service,dao层的类
- 创建配置类
注意:
@ComponentScan:扫描com.test路径下所有包的类 - 创建测试类
注意:如上图,首先使用AnnotationConfigApplicationContext加载配置类MainConfig,获取到
ApplicationContext上下文对象,然后通过这个上下文对象去获取通过配置类扫描加载
那些使用注解创建的bean对像,例如通过@Controller,@Service,@Repository等注
解创建的bean对象。ApplicationContext上下文获取到容器中的这些对象后打印出来。
效果:
- 下面我们在扫描加载并且创建bean对象到spring容器中时可以排除一些不需要创建的bean对象。
注意:
excludeFilters:表示在扫描加载的路径下排除一些不需要加载到容器中的bean对象,
使用@Filter进行过滤,在@Filter中使用注解类型过滤, 这里我们不
需要加载 Controller和Service类型的bean对象到容器中去。
运行测试类后的效果:
- 当然在@ComponentScan注解中还有其他的一些注解规则,例如includeFilters方法,表示
只加载创建哪些类型的bean对象。但是这个includeFilters必须和useDefaultFilters一起用才
会生效,否则不生效。
效果:
- 上面我们使用includeFilters指定过滤规则时使用了FilterType.ANNOTATION的方式
去过滤的,其实在FilterType中还有其他的方式,如下:
⑴FilterType.ANNOTATION:是按照注解方式
⑵FilterType.ASSIGNABLE_TYPE:是按照给定的类型,比如我们现在指定加载BookService类型。
效果:
⑶FilterType.ASPECTJ:使用ASPECTJ表达式方式(这个基本不会使用)
⑷FilterType.REGEX:使用正则表达式方式(这个不常使用)
⑸FilterType.CUSTOM:使用自定义规则方式,如下:
a:创建实现了TypeFilter的类
注意:
MetadataReader:表示的是读取到的当前正在扫描的类的信息
MetadataReaderFactory:表示可以获取到其他任何类信息
b:在配置类中使用我们自定义的过滤类
c:运行测试类的效果:
三:组件作用域之@Scope
- 简介
@Scope作用域它存在4种情况:
a:prototype,表示多实例的,每一个获取bean对象,都会创建一次
b:singleton,表示单实例的(默认的@Scope也是单实例的),在IOC容器启动的时候就会调用方法创建
对象放到IOC容器中,以后每次获取就是直接从容器中拿。
c:request,同一次请求创建一个实例
d:session,同一个session创建一个实例 - 创建一个配置类,创建person对象,并且默认为单实例
a:配置类
b:测试类
c:效果:
- 设置@Scope为多实例试试看效果:
测试类:
效果:
四:懒加载之@Lazy
- 简介
首先懒加载是专门针对单实例bean的。单实例bean一般是默认在容器启动的时候创建对象,而
如果我们使用懒加载后,就会变成容器启动的时候不创建对象,会在第一次使用(获取)bean对象
的时候去创建bean对象并且初始化。 - 实例:我们不使用懒加载时的效果:
a:配置类
b:测试类
c:效果
- 实例:我们使用懒加载时的效果:
a:在配置类创建person对象的方法上添加懒加载
b:测试类
c:效果