@Configuration注解:
标注在类上,告诉spring这是一个配置类,配置类等同于配置文件,在使用时,将以往的ClassPathXmlApplicationContext("spring的xml文件全路径名"),用AnnotationConfigApplicationContext(配置类.class)代替,这样就可以通过配置类来创建容器。
@Configuration
public class MyConfig {
static {
System.out.println("配置类加载...");
}
}
public class AnnotationTest {
@Test
public void testConfig(){
System.out.println("======测试类开始======");
ApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class);
System.out.println("======IOC容器创建完成======");
}
}
测试输出:
@Bean注解:
给容器中注册一个bean,类型为返回值的类型,bean的id默认为其方法名,也可以在Bean注解中添加参数,对其进行自定义命名。
//配置类
@Configuration
public class MyConfig {
static {
System.out.println("配置类加载...");
}
@Bean("person") //默认为方法名小写,返回的bean的id
public Person getPerson(){
System.out.println("向容器中添加person");
return new Person("张三",20);
}
}
//测试类
public class AnnotationTest {
@Test
public void testComponentScan(){
System.out.println("======测试类开始======");
ApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class);
System.out.println("======IOC容器创建完成======");
String[] definitionNames = ctx.getBeanDefinitionNames();
for (String name : definitionNames){
System.out.println("bean 的定义名是:" + name);
}
}
}
测试输出:
@Scope和@Lazy注解:
scope注解用于设置组件的作用于,在缺省值的情况下,默认创建单实例对象,有4个可选值,一般情况下,选择
prototype和singleton两种。单实例时,IOC容器 启动时 就会调用方法创建对象,并将其放入IOC容器中, 以后每次获取,都是从IOC容器中拿取该对象;多实例时,IOC容器启动时不会调用方法创建对象, 而是在每次获取对象时,调用方法创建对象。
懒加载可以看做scope单实例的一种特殊情况,IOC容器 启动时 不创建对象第一次获取对象时,创建对象并加入到容器中 以后每次获取,都是从IOC容器中拿取该对象。
//配置类
@Configuration
public class MyConfig2 {
/**
* SCOPE_SINGLETON = "singleton": 单实例
* 在单实例情况下:
* IOC容器 启动时 就会调用方法创建对象,并将其放入IOC容器中,
* 以后每次获取,都是从IOC容器中拿取该对象
* SCOPE_PROTOTYPE = "prototype": 多实例
* 在多实例情况下:
* IOC容器启动时不会调用方法创建对象,
* 而是在每次获取对象时,调用方法创建对象
* @Lazy: 懒加载
* 单实例bean,IOC容器 启动时 不创建对象
* 第一次获取对象时,创建对象并加入到容器中
* 以后每次获取,都是从IOC容器中拿取该对象
*/
//@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) //也可以写为:@Scope("prototype"),不加参数默认为单实例
@Lazy
@Bean("person")
public Person getPerson(){
System.out.println("向容器中添加person");
return new Person("张三",23);
}
}
//测试类
public class AnnotationTest {
@Test
public void testScope(){
System.out.println("======测试类开始======");
ApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig2.class);
System.out.println("======IOC容器创建完成======");
Person p1 = ctx.getBean(Person.class);
Person p2 = (Person) ctx.getBean("person");
System.out.println(p1==p2);
}
}
三种情况下的输出:
通过输出可以看到,缺省时,在IOC容器创建完成之前就先创建好了Bean,而懒加载和多实例时,都是在使用到Bean的时候,才进行创建,懒加载创建的Bean是同一个对象,而多实例创建的Bean是两个不同的对象