把配置类改一下:给Bean注解()后加上东西
再打印测试类:
或者这样拿:
拿到了mainConfig2,因为这个类加了Configuration注解,还拿到了这个类里的Bean注解person,还拿到了我加了Service和Controller注解的类的名字。
1,单实例bean:
2,多实例bean
3,request和session
默认的scope是单例。ioc容器启动的时候会调用方法创建对象并放到ioc容器中,以后每次获取的就是从容器中拿的同一个Bean
多实例的bean是prototype的,ioc容器启动的时候并不会调用方法创建对象,而是每次获取对象的时候才会调用方法创建该Bean
剩下还有request和session的bean,request是针对web应用,每次请求创建一个实例,session是同一个session创建一个实例。
Scope注解的单例是容器创建成功的时候,bean就已经创建好了,而多实例不会,上面也提到了,上代码看效果:
这是单例:
这是多实例:
条件注册bean,这个注解是这么玩的:
测试:
除了Bean注解注册bean,ComponentScan注解扫描bean注入那样,还有Import注解的方式可以注入bean。
注意:Import注解只能作用于配置类上。
先来两个实体类:Dog和Cat
然后配置类:配置类上写上需要注入的组件也就是实体类的class
测试:通过Import注解注入容器中,代码拿到的注入的类的名字是类的全名,
采用ImportSelector的方式注入:
首先写一个Demo类:实现ImportSelector接口,重写方法,然后如下图
然后在配置类中 Import(Demo.class)就ok了。
然后测试:
采用ImportBeanDefinitironRegistar注入bean:
加入需要注入一个Rabbit类。条件是容器中需要同时存在pig和dog类,才创建rabbit类加入到容器中,那么代码是Rabbit类 需要实现 ImportBeanDefinitironRegistar接口
然后在配置类中Import注解中,添加 Rabbit.class 即可
测试:
FactoryBean是工厂Bean,可以把Java实例bean通过FactoryBean注入到容器中
而BeanFactory是开发人员可以从容器中获取实例化后的bean。
创建类:
然后在配置类中@Import导入StudentFactoryBean也可以,在配置类中写方法使用@Bean注解也可以。为了避免@Import导入的代码已经太长,我选择@Bean的方式
测试类:
为什么这里打印的是Student类,而不是StudentFactoryBean呢?StudentFactoryBean不也是加了@Bean注解了吗?为什么打印不到?
其实这个问题跟一下源码就可以知道 ,如果想拿到StudentFactoryBean这个类的话,那么
Object o = app.getBean(“&studentFactoryBean”);
加一个 & 就可以了,我就不测试了。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!