一、查看容器中的Bean实例
查看springboot
中的容器实例,首先,我们要获取到IOC
容器。
//1、返回我们的IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
这个获取实例的具体实现类是:org.springframework.beans.factory.support.DefaultListableBeanFactory
其内部,有很多关于容器实例的获取方式
二、向容器中注册Bean实例
我们知道,在springmvc
中,向IOC
容器中注册实例的方式有两种
1、xml
配置文件里面通过bean
标签实现向容器中注册Bean
实例。
2、通过扫描注解标注的类,来实现向容器中注册Bean
实例。
在springboot
中,已经不建议使用xml
配置文件,那么,该如何向IOC
容器中注册组件了?
1、扫描注解方式
启动类加上扫描路径
@SpringBootApplication(scanBasePackages = "com.atguigu.boot")
或者
@ComponentScan("com.atguigu.boot")
那么,在这个包路径下,加上springboot
定义的注解类,都会注册到容器中
如:@Bean、@Component、@Controller、@Service、@Repository
这种方式,在springmvc
中,对应的配置如下
<!-- 开启注解 -->
<context:annotation-config></context:annotation-config>
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<!-- 扫描文件 -->
<mvc:annotation-driven/>
<context:component-scan base-package="com.kfc" >
<!--扫描serveice等注解的类-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" />
<context:include-filter type="annotation" expression="org.springframework.stereotype.Component" />
<!--排除Controller,Controller由springmvc加载-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
2、@Configuration配置类方式
这个注解标注的类,就相当于以前的xml
配置文件。
- 1、配置类里面使用
@Bean
标注在方法上给容器注册组件,默认也是单实例的,实例名默认是方法名
- 2、配置类本身也是组件
即上图中的MyConfig
类,也是IOC
容器中的组件 - 3、proxyBeanMethods:是否代理bean的方法
- @Configuration(proxyBeanMethods = false),建议默认配置true即可。
- Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
- Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
- 组件依赖必须使用Full模式。其他默认选择Lite模式
3、@Conditional条件装配方式
这个注解,有很多子注解。
当条件满足什么情况时,就向容器中注册组件。
比如:当容器中没有A实例
的时候,就向容器中注册一个A实例
。这样,可以节省JVM
内存空间。
注意:这个注解一般配合@Configuration
标注的配置类上使用。也可以用在任何一个组件类上
如:@ConditionalOnMissingBean(name = "tom")
,IOC
中没有tom
实例,就注册一个该实例。
4、@ImportResource和@Import方式
@ImportResource
,可以将眼前的xml
配置中配置的bean
,注册到IOC
中。方便对以前的springmvc
升级。
@ImportResource("classpath:beans.xml")
,其中beans.xml
在resources
目录下。
@Import
,用于将第三方jar包中的类
,注册到IOC
容器中。
用法:
@Import({User.class, DBHelper.class})
,这里的DBHelper
是ch.qos.logback.core.db.DBHelper
。
三、删除容器中的Bean实例
在Spring Boot
中,你不能直接从IOC容器
中删除一个实例,因为IOC容器
管理的是实例的生命周期,包括创建和销毁。一旦容器启动,它会保持对所有管理的bean
的引用,以便于调用。
四、用法总结
其实,我们平时开发,最关心的就3个方面:
1、自己写的类,我们怎么注册到IOC
容器中?
这个,我们用配置类或者包扫描的方式实现。
2、第三方jar
包的类,我们怎么注册到IOC
容器中?
使用@Import
注解实现。
3、以前的springmvc
中,xml
配置的组件,如何导入到springboot
的IOC
容器中?
使用@ImportResource
注解实现。