代码:
/* * Copyright 2012-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */
package yjnic;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Test {
@Bean
String home() {
System.out.println("this will be print out without use it!");
return "Hello World!!!!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Test.class, args);
}
}
一开始以为没有使用 home 这个 bean 不是初始化 ,结果我错了,
结果
一大坨输出blabla......
this will be print out without use it!
一大坨输出blabla.......
然后看了下相关资料,大概猜测了下(哪位路过的大侠看到有错,麻烦留言下,避免我坑到后来者!!)
spring boot 会将扫描到的 bean (@Scope("prototype") 除外)new 一下,然后用一个容器保存起来,用的时候直接到这个容器去拿
如果加上@Scope("prototype")
package yjnic;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
@SpringBootApplication
public class Test {
@Bean
@Scope("prototype") // 加了这个
String home() {
System.out.println("this will be print out without use it!");
return "Hello World!!!!";
}
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext ctx = SpringApplication.run(Test.class, args);
System.out.println("begin use the bean");
ctx.getBean("home");// 获取他
}
}
结果
一大坨输出blabla......
begin use the bean
this will be print out without use it!
这个会相对来说比较好理解,
加上 @Scope("prototype") 是为了让作用域改成 每次获取 的都是一个新实例,spring 就没必要一开始就 new 一个出来,所以会在使用的时候才 new 一个实例出来
网友评论