容器 扩展原理 web
1. @configuration@Bean给容器中注册组件
- 没用注解前是通过以下方式获取bean
首先>需要编写beans.xml文件
然后>通过类路径去获取IOC容器,通过IOC容器取获取bean 代码如下:
ApplicationContext ac = ClassPathXmlApplicationContext(“beans.xml”);
Person bean = (person)ac.getBean(”person");
( 这里的Person是实体类,getBean中的是配置文件中的bean标签中的 id 名称,映射到实体类中) - 现在使用注解的方式,注册组件
@configuration >告诉spring这是一个配置类
@Bean >给容器中注册一个Bean,类型是返回值类型,id默认是方 法名作为id
获取方法AnnotationConfig
ApplicationContext ac = AnnotationConfigApplicationContext(配置类名称.class);
这里通过person类型获取,方法名作为id
Person bean = ac.getBean(person.class);
修改方法名可以修改id,也可以通过注解修改id名称
在该方法的注解上添加 value 如:@Bean(“person1”)
2. @ComponentScan自动扫描组件指定扫描规则 包扫描
【包扫描:只要标注的@Controller @Service @Repository @Component 的注解,就会被自动扫描加进容器中】
- .xml配置如下:<context:component-scan base-package=“com.msyang” use-default-filters=“false”></context:component-scan>
默认规则是扫描所有是true,改成false禁用默认规则,只包含才生效 - 注解配置如下:
在配置类上添加注解
@ComponentScan(value=“com.msyang”,excludeFilters={
@Filter(type=filterType.ANNOTATION,classes={Controller.class,Service.class},
@Filter(type=filterType.ASSIGNABLE_TYPE,classes={BookService(类名).class},
useDefaultFilters = false)
})- value:指定要扫描的包
- excludeFilters:指定扫描的时候按照什么规则,排除哪些组件
- includeFilters:指定包含哪些组件
- useDefaultFilters :禁用默认规则扫描所有
- JDK8以后@ComponentScan可以重复多写几次,指定不同的扫描策略
- 如果不是JDK8也可以使用以下注解,多次指定
@ComponentScans(
value={
@ComponentScan(…这里同上省略)
}
) - filterType.ANNOTATION:按照注解
- filterType.ASSIGNABLE_TYPE:按照指定的类型
- filterType.REGEX:使用正则表达式
- filterType.CUSTOM:使用自定义规则,需要自己编写规则类实现TypeFilter类