Springboot2-给容器添加组件
配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
1、创建组件类如:
package com.example.bean;
public class User {
}
package com.example.bean;
public class Pet {
}
2、创建配置类,如:
```java
package com.example.config;
import ch.qos.logback.core.db.DBHelper;
import com.example.bean.Pet;
import com.example.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
* 2、配置类本身也是组件
* 3、proxyBeanMethods:代理bean的方法
* proxyBeanMethods=false,如果组件之间不会相互依赖就用false,它不会检查容器中是否有组件,直接调用,每一个都是新的
* proxyBeanMethods=true,如果组件之间相互依赖就要true,每次调用之前会检查容器中是否有该组件,若有则不再调用,如无,则会调用
* Full(proxyBeanMethods = true)(全配置)
* Lite(proxyBeanMethods = false)(轻量级配置)
* 4、@Import({User.class, DBHelper.class})
* 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
*/
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
/**
* 外部无论对配置类中的这个组件注册方法调用多少次,获取的都是之前注册容器中的单实例对象
* @return
*/
@Bean //给容器中添加组件,以方法名作为组件的id,返回类型就是组件类型,返回的值就是组件在容器中的实例
// public User user01(){
// return new User("zhangsan",18);
// }
public User user01(){
User zhangsan=new User("zhangsan",18);
//User组件依赖了Pet组件
zhangsan.setPet( tomcatPet());
return zhangsan;
}
@Bean("tom") //若不想以方法名作为组件id,可以在@Bean()中添加想要设置的组件id
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
3、在主程序中进行调用,如:
package com.example;
import ch.qos.logback.core.db.DBHelper;
import com.example.bean.Pet;
import com.example.bean.User;
import com.example.config.MyConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication //这是一个SpringBoot应用
public class MainApplication { //主程序类,主配置类
public static void main(String[] args) {
//SpringApplication.run(MainApplication.class,args);
//1、返回我们IOC容器
ConfigurableApplicationContext run=SpringApplication.run(MainApplication.class,args);
//2、查看容器里面的组件
String[] names=run.getBeanDefinitionNames();
for(String name:names){
System.out.println(name);
}
//3、从容器中获取组件
Pet tom01=run.getBean("tom",Pet.class);
Pet tom02=run.getBean("tom",Pet.class);
System.out.println("组件:"+(tom01==tom02));
//4、获取到的是代理对象,配置类本身也是一个组件
MyConfig bean01=run.getBean(MyConfig.class);
System.out.println(bean01);
//如果@Configuration(proxyBeanMethods = true)代理对象调用方法,Springboot总会检查这个组件是否在容器中有
//保持组件单实例
User user=bean01.user01();
User user1=bean01.user01();
System.out.println(user==user1);
User user01=run.getBean("user01",User.class);
Pet tom=run.getBean("tom",Pet.class);
System.out.println("用户的宠物:"+(user01.getPet()==tom));
//5、获取组件
String[] beanNamesForType=run.getBeanNamesForType(User.class);
System.out.println("=====");
for (String s : beanNamesForType) {
System.out.println(s);
}
DBHelper bean=run.getBean(DBHelper.class);
System.out.println(bean);
}
}