Bean扫描
若想扫描Bean,需要配置
- 标签
<context:component-scan base-package="包路径">
- 注解
@ComponentScan(basePackages = "包路径")
但是并没有配置,这是因为启动类的@SpringBootApplication
包含三个注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
这里可以发现@ComponentScan
并没有指定包路径,这是因为它默认扫描启动类所在的包及其子包。如果需要访问的类不在其子包下,需要在该类添加注解并且标注包路径
Bean注册
有四种注解方式, 后面三个都是@Component
的衍生注解,作用是标注更明确
@Component
@Controller
标注在控制器类上@Service
标注在业务类上@Repository
标注在数据访问类上
如果要注册的bean对象来自于第三方(不是自定义),是无法用@Component
及其衍生注解来声明bean的。
@Bean
解决
视频通过创建config
包,CommonConfig
类,注册第三方bean。
package com.walker.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CommonConfig {
@Bean
public A a(){
return new A();
}
}
获得bean, 也可以在@Bean(“xxxx”),指定bean的id
ApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);
ctx.getBean("类名(首字母小写)");
@Import
解决
在启动类添加@Import(类.class)
如果需要Import的Bean太多,可以使用ImportSelector
接口实现类
package com.walker.config;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class CommonImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.walker.config.CommonConfig"};
// 包的全路径.类名
}
}
在启动类中添加@Import(CommonImportSelector.class)
还有些目前不理解的做法,到时候回看