在bean
包中预备两个Java Bean对象:
-
Pet
package com.tom.boot.bean; /** * Created on 2021/2/15. * * @author Tom Goh */ public class Pet { String name; public Pet() { } public Pet(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
-
User
package com.tom.boot.bean; /** * Created on 2021/2/15. * * @author Tom Goh */ public class User { String name; String age; public User() { } public User(String name, String age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age='" + age + '\'' + '}'; } }
在原生的Spring中可以使用配置文件中的
<bean>
条目将其实例化至容器中,此处不表。在Spring Boot中可以使用专门的配置类来实现Bean的实例化,与使用注解的Spring IOC注入类似。
创建
config
包,并在其中创建MyConfig
这一对象,在类名称上方使用注解@Configuration
声明其为配置类,在类中使用方法实例化Bean对象并在方法上方使用@Bean
注解实现注入:@Configuration public class MyConfig { @Bean("UserBean") public User user01(){ return new User("Tom","21"); } @Bean public Pet pet01(){ return new Pet("tomcat"); } }
@Configuration
@Configuration
在一个类的上方则表示该类为一个配置类,相当于一个Spring配置文件,本身也是一个组件。
在@Configuration
配置中,有一个重要属性proxyBeanMethods
,指的是该配置类代理Bean的方法,有true与false两个取值。
-
当
proxyBeanMethods=true
时,使用的是代理配置的Full模式,当该属性缺省时也默认为该值。在Full模式下,任何一个在该配置类中注入的Bean对象均为单实例模式:
MyConfig bean=run.getBean(MyConfig.class); User user3=bean.user01(); User user4=bean.user01(); System.out.println("FULL:"+(user3==user4)); System.out.println(bean);
输出结果为:
可以看到,作为配置类的
MyConfig
是一个被Spring中的CGLIB增强的代理对象,在proxyBeanMethods=true
时,无论调用多少此该配置类中的注入方法均会获得第一次调用时注入的对象。也就是说,
proxyBeanMethods=true
时,Spring Boot总会检查使用注册方法生成的对象在容器中是否已经存在,存在即返回容器中的对象,不存在则创建。 -
当
proxyBeanMethods=false
时,使用的是Lite模式,MyConfig
对象未经CGLIB增强,没有成为一一个代理对象,上述代码的输出结果如下:可以看到,调用多次注入方法,注入的Java Bean不在是单实例模式,而是每次调用方法时生成一个不同的Bean对象。
当容器中组件没有相互依赖关系时,建议使用Lite模式,以便加速Spring Boot启动;
当容器中组件存在依赖时,使用Full模式更好处理依赖关系。
@Bean
在配置类中的注入方法上方添加@Bean
注解,以在容器中注册组件。
@Bean("UserBean")
public User user01(){
return new User("Tom","21");
}
在配置类中使用@Bean注册组件,默认为单实例。
向容器中添加组件,默认方法名作为组件的名称,倘若在@Bean注解后增加("…")则修改名称为注释后的名称。