一,三种获取方式(获取单例bean对象)
默认情况下Spring项目启动时会把bean都创建好放在IOC容器中,如果想要主动获取这些bean对象
根据name获取bean
Object getBean(String name)根据类型获取bean
<T> T getBean(Class<T> requiredType)根据name获取bean(带类型转换)
<T> T getBean(String name, Class<T> requiredType)要从IOC容器当中来获取到bean对象,需要先拿到IOC容器对象,怎么样才能拿到IOC容器呢?
1,先通过Autowired获取IOC容器对象
@Autowired private ApplicationContext applicationContext; //获取IOC容器对象
2,然后通过IOC容器对象ApplicationContext对象获取对应的IOC容器对象
//根据bean名称获取 获取完成后会报错,然后我们强转为studentController对象 StudnetController bean1 = (StudnetController) applicationContext.getBean("studnetController"); System.out.println(bean1); //根据类型获取bean对象 StudnetController bean2 = applicationContext.getBean(StudnetController.class); System.out.println(bean2); //根据bean的名称和对象获取 StudnetController bean3 = applicationContext.getBean("studnetController",StudnetController.class); System.out.println(bean3);
二,bean的作用域
1, 配置作用域
通过在对应的类对象上加上@Scope 注解来配置作用域
作用域 说明 singleton 容器内同名称的bean只有一个实例(单例)(默认) prototype 每次使用该bean时会创建新的实例(非单例)
三,第三方Bean管理
PS: 很多依赖中需要我们反复实例化对象,但是他们的类文件又是只读的我们无法在上面加上@Component对现象,所以我们就要用到
1,在启动类上添加@Bean标识的方法(不建议)
@SpringBootApplication public class SpringbootWebConfig2Application { public static void main(String[] args) { SpringApplication.run(SpringbootWebConfig2Application.class, args); } //声明第三方bean @Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean public SAXReader saxReader(){ return new SAXReader(); } }
2,创建一个配置类在配置类中定义@Bean标识的方法
@Configuration //配置类 (在配置类当中对第三方bean进行集中的配置管理) public class CommonConfig { //声明第三方bean @Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean //通过@Bean注解的name/value属性指定bean名称, 如果未指定, 默认是方法名 public SAXReader reader(DeptService deptService){ System.out.println(deptService); return new SAXReader(); } }