@Configuration注解+@Bean给容器中注入组件
在maven项目中,定义一个Person实体类,配置beans.xml文件
<bean class="com.atguigu.pojo.Person" id="person">-->
<property name="name" value="奥利给"/>-->
<property name="age" value="100"/>-->
</bean>-->
定义一个类,头上加上@Configuration注解,目的就是相当于这个类是个配置类,等价于beans.xml文件,在配置类里面定义
// @Bean:给容器中注册一个Bean类型为返回值的类型,id默认是用方法名作为id
// name=“ ” 配置bean的名字,便于getBean()时直接用别名
@Bean(name = "personBeanName")
public Person person(){
return new Person();
}
@ComponentScan注解是自动扫描组件,也可以指定扫描规则
- 配置xml文件解决:在beans.xml中配置
//use-default-filters 默认的扫描规则,true为开启,false为关闭
<context:component-scan base-package="com.atguigu" use-default-filters="false">
<context:include-filter type="annotation" expression=""/>-->
<context:exclude-filter type="annotation" expression=""/>-->
</context:component-scan>
- 配置类注解
- excludeFilters[ ] 指定哪些类型不适合进行组件扫描
- includeFilters[ ] 指定哪些类型适合进行组件扫描
- useDefaultFilters 默认的扫描规则,true为开启,false为关闭
@Configuration
@ComponentScan(
value = "com.atguigu",
includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
},useDefaultFilters = false)
public class SpringConfig {
@Scope注解设置组件的作用域
在beans.xml中或者在配置类中配置该选项
常见的有4种作用域
- prototype:多实例的,IOC容器启动并不会去调用方法创建对象放在容器中,每次获取的时候才会调用方法创建对象
- singleton:单实例的(默认值),IOC容器启动时会调用方法创建对象放到IOC容器中,以后每次获取就是直接从容器中(map.get())去拿
- request:同一个请求创建一个实例,
- session:同一个session创建一个实例
懒加载
- 单实例bean:默认在容器启动的时候创建对象
- 懒加载:容器启动不创建对象,第一次使用(获取)Bean才会创建对象,并初始化
如:ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
当只有这一行代码时,并且没加懒加载的情况下,且在单实例作用域的情况下,在创建容器的时候顺便创建配置类中声明的@Bean对象。加了懒加载的情况下,在创建容器的时候不会创建对象,只有在getBean()
的情况下才会创建对象。