标签:修改 main code EAP spring容器 一个 除了 功能 lan
bean包中有两个类User和Pet
package com.studymyself.bean;
public class User {
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name=‘" + name + ‘\‘‘ +
‘}‘;
}
}
package com.studymyself.bean;
public class Pet {
private String name;
public Pet() {
}
public Pet(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Pet{" +
"name=‘" + name + ‘\‘‘ +
‘}‘;
}
}
/**
* @Configuration:
* 1、在类上面添加该注解,告诉spring boot这个类是一个配置类,等同于容器的配置文件
* 2、当然,这个配置类的对象也是一个组件,被放到容器中。
*/
@Configuration
public class MyConfig {
/**
* @Bean:
* 1、放在方法上面表示给容器添加组件,组件值是返回的实例,默认将该方法名作为组件(返回的实例)的id,
* 2、通过测试,放进容器中的组件是单实例的
3、可以修改其默认的组件id名,注解中注解中 @Bean(name = "aa")这样修改
*/
@Bean
public User user01(){
User user = new User("张三");
return user;
}
@Bean
public Pet tomcat(){
Pet pet = new Pet("tomcat");
return pet;
}
}
@SpringBootApplication
public class BSpringbootAnnotationApplication {
public static void main(String[] args) {
//获取容器对象
ConfigurableApplicationContext run = SpringApplication.run(BSpringbootAnnotationApplication.class, args);
//验证从容器中获取在配置类中添加的组件user01和tomcat
User user1 = run.getBean("user01",User.class);
Pet pet = run.getBean("tomcat",Pet.class);
System.out.println(user1+"\n"+pet);
//再获取一次user01,跟第一次获取的比较,验证是否是同一个
User user2 = run.getBean("user01",User.class);
System.out.println(user1==user2);
//验证配置类也被创建对象作为组件放进容器中
MyConfig bean = run.getBean(MyConfig.class);
System.out.println(bean);
//com.studymyself.config.MyConfig$$EnhancerBySpringCGLIB$$767ae820@56febdc
}
}
结果:
User{name=‘张三‘}
Pet{name=‘tomcat‘}
true
@SpringBootApplication
public class BSpringbootAnnotationApplication {
public static void main(String[] args) {
//获取容器对象
ConfigurableApplicationContext run = SpringApplication.run(BSpringbootAnnotationApplication.class, args);
//验证从容器中获取在配置类中添加的组件user01和tomcat
User user1 = run.getBean("user01",User.class);
Pet pet = run.getBean("tomcat",Pet.class);
System.out.println(user1+"\n"+pet);// User{name=‘张三‘} Pet{name=‘tomcat‘}
//再获取一次user01,跟第一次获取的比较,验证是否是同一个
User user2 = run.getBean("user01",User.class);
System.out.println(user1==user2);//true
//验证配置类也被创建对象作为组件放进容器中
MyConfig myConfig = run.getBean(MyConfig.class);
System.out.println(myConfig);
//com.studymyself.config.MyConfig$$EnhancerBySpringCGLIB$$767ae820@56febdc
//验证@Configuration注解中属性proxyBeanMethods=true时,调用配置类中的方法
User user3 = myConfig.user01();
User user4 = myConfig.user01();
System.out.println(user3==user4);//true
}
}
结果:
User{name=‘张三‘}
Pet{name=‘tomcat‘}
true
com.studymyself.config.MyConfig$$EnhancerBySpringCGLIB$$767ae820@56febdc
true
@SpringBootApplication
public class BSpringbootAnnotationApplication {
public static void main(String[] args) {
//获取容器对象
ConfigurableApplicationContext run = SpringApplication.run(BSpringbootAnnotationApplication.class, args);
//验证从容器中获取在配置类中添加的组件user01和tomcat
User user1 = run.getBean("user01",User.class);
Pet pet = run.getBean("tomcat",Pet.class);
System.out.println(user1+"\n"+pet);// User{name=‘张三‘} Pet{name=‘tomcat‘}
//再获取一次user01,跟第一次获取的比较,验证是否是同一个
User user2 = run.getBean("user01",User.class);
System.out.println(user1==user2);//true
//验证配置类也被创建对象作为组件放进容器中
MyConfig myConfig = run.getBean(MyConfig.class);
System.out.println(myConfig);
//com.studymyself.config.MyConfig$$EnhancerBySpringCGLIB$$767ae820@56febdc
//com.studymyself.config.MyConfig@4dd94a58
// //验证@Configuration注解中属性proxyBeanMethods=true时,调用配置类中的方法
// //这里就是代理对象调用方法
// User user3 = myConfig.user01();
// User user4 = myConfig.user01();
// System.out.println(user3==user4);//true
//验证@Configuration注解中属性proxyBeanMethods=false时,调用配置类中的方法
//这里就是MyConfig的普通对象调用方法
User user3 = myConfig.user01();
User user4 = myConfig.user01();
System.out.println(user3==user4);//false
}
}
结果:
User{name=‘张三‘}
Pet{name=‘tomcat‘}
true
com.studymyself.config.MyConfig@4dd94a58
false
使用Full模式的前提是你项目中的组件有组件依赖,比如说User类中有一个Pet类型的属性,当User和Pet类下组件都被放到容器中后,User组件中的Pet属性希望使用的是容器中的Pet组件,就是依赖于这个容器中的Pet组件,需要使用Full模式。
当我们使用的这些组件都不依赖于容器中的组件,那么就使用Lite模式。
--结论:
配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
标签:修改 main code EAP spring容器 一个 除了 功能 lan
原文地址:https://www.cnblogs.com/rjzhong/p/14892960.html