Scope,也称作用域,在Soring Ioc容器指其创建的Bean对象对其他Bean对象的请求可见范围,在Spring IoC 容器中具有以下几种作用域,基本作用域(singleton,prototype),web作用域(request,session,globalsession),自定义作用域
scope作用域有四种:
1、singleton 单实例
2、prototype 多实例
3、request springweb中request
4、session springweb中session
5、global session
在xml中的使用
<bean id="role" class="com.bean.Ponse" scope="singleton"/>
注解中使用作用域
package com.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import com.bean.Ponse;
@Configuration //告诉spring这是一个配置类
public class MianConfig2 {
@Bean("ponse") //也方法名来作为bean的id
@Scope("singleton") //验证单例
public Ponse getPonse() {
// TODO Auto-generated method stub
System.out.println("调用getPonse方法创建对象。。。");
return new Ponse("你好",12);
}
}
测试类
package com;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.bean.Ponse;
import com.config.MianConfig;
import com.config.MianConfig2;
public class DemoTest {
@Test
public void Test02() {
System.out.println("准备加载ioc容器。。。");
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MianConfig2.class);
System.out.println("初始化ioc容器完成。。。");
Ponse ponse = (Ponse) applicationContext.getBean("ponse");
Ponse ponse1 = (Ponse) applicationContext.getBean("ponse");
System.out.println(ponse==ponse1);
}
结果:
在什么时候创建的呢?
多例情况下会是怎么样呢?
//只需要将@Scope("singleton") 改为@Scope("prototype")就可以
总结:从上面来看
singleton:是单例的,在IOC容器启动的时候就会调用getPosen方法,创建对象放入ioc容器中,以后每次获取就直接从ioc容器(相当于 map.get()方法)中拿
prototype:多实例,ioc启动的时候不会调用方法创建对象,而是每次获取的时候采去调用方法创建对象;
懒加载:是针对单实例的
单实例bean默认在容器创建的时候就创建对象
懒加载:加载容器的时候不创建对象,而是在第一次获取的时候才开始创建,并初始化
package com.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import com.bean.Ponse;
@Configuration //告诉spring这是一个配置类
public class MianConfig2 {
@Bean("ponse") //也方法名来作为bean的id
//@Scope("prototype")
@Lazy
public Ponse getPonse() {
// TODO Auto-generated method stub
System.out.println("调用getPonse方法创建对象。。。");
return new Ponse("你好",12);
}
}
测试类
package com;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.bean.Ponse;
import com.config.MianConfig;
import com.config.MianConfig2;
public class DemoTest {
@Test
public void Test02() {
System.out.println("准备加载ioc容器。。。");
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MianConfig2.class);
System.out.println("初始化ioc容器完成。。。");
// Ponse ponse = (Ponse) applicationContext.getBean("ponse");
// Ponse ponse1 = (Ponse) applicationContext.getBean("ponse");
// System.out.println(ponse==ponse1);
}
}
结果:
加上@Lazy 这是还没创建对象
当我们把下面代码放开,可以看到只有等容器加载完成,才进行调用方法创建对象
Ponse ponse = (Ponse) applicationContext.getBean("ponse");
Ponse ponse1 = (Ponse) applicationContext.getBean("ponse");
System.out.println(ponse==ponse1);
给容器导入组件的方式
1、通过包扫描+组件标注注解( @Repository,@Service, @Controller)
2、通过@Bean[导入第三方包里面的组件]
3、@Import [快速给容器导入一个组件]
1)、@Import(要导入 的组件),容器中就会自动到入这个组件,默认id是类全名
2)、ImportSelector 返回需要导入类全名的数组
3)、ImportBeanDefinitionRegistrar手动注册Bean到容器
4、使用Sprin提供的BeanFactory(工厂bean)
@Configuration //告诉spring这是一个配置类
@Import(MyImprot.class)
public class MianConfig2 {
@Bean("ponse") //也方法名来作为bean的id
//@Scope("prototype")
//@Lazy
public Ponse getPonse() {
// TODO Auto-generated method stub
System.out.println("调用getPonse方法创建对象。。。");
return new Ponse("你好",12);
}
}
自定义逻辑类,这里需要自定义cool、red类
package com.condition;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
//自定义逻辑需要返回的组件
public class MyImprot implements ImportSelector {
/**
* 返回值就是导入容器中的组件全类名 返回值不可以为空 可以是空数组
* AnnotationMetadata :获取所有注解中的元数据
*/
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
importingClassMetadata.getClassName();
return new String[]{"com.bean.Cool","com.bean.Red"};
}
}
测试类
package com;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.bean.Ponse;
import com.config.MianConfig;
import com.config.MianConfig2;
public class DemoTest {
@Test
public void Test02() {
System.out.println("准备加载ioc容器。。。");
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MianConfig2.class);
System.out.println("初始化ioc容器完成。。。");
String[] naStrings = applicationContext.getBeanDefinitionNames();
for (String string : naStrings) {
System.out.println(string);
}
}
结果: