目录
Bean扫描
Bean注册
@Bean
@lmport
自定义注解
注册条件
Bean扫描
Bean扫描有两种方式
1、标签:<context:component-scan base-package="com.mybatis"/>
2、注解: @ComponentScan(basePackages = "com.mybatis")
springboot启动类注解可以自动扫描,它包含了@ComponentScan注解,默认扫描启动类所在的包及其子包。
Bean注册
注解 | 说明 | 位置 |
@Component | 声明bean的基础注解 | 不属于以下三类时,用此注解 |
@Controller | @Component的衍生注解 | 标注在控制器类上 |
@Service | @Component的衍生注解 | 标注在业务类上 |
@Repository | @Component的衍生注解 | 标注在数据访问类上(由于与mybatis整合,用的少) |
如果要注册的bean对象来自于第三方(不是自定义的),是无法用@Component及衍生注解声明
bean的,spring提供了两个注解来处理这个问题@Bean,@lmport
使用将本地jar包 放入到maven仓库
mvn install:install-file -Dfile=C:\Users\Administrator\Desktop\jar\common-pojo-1.0-SNAPSHOT.jar -DgroupId=cn.itcast -DartifactId=common-pojo -Dversion=1.0 -Dpackaging=jar
导入后引入依赖坐标
<dependency>
<groupId>cn.itcast</groupId>
<artifactId>common-pojo</artifactId>
<version>1.0</version>
</dependency>
@Bean
可以写一个配置类来声明
注册对象默认的名字是:方法名
如果方法的内部需要使用到ioc容器中已经存在的bean对象,,那么只需要在方法上声明即可, spring会自动的注入。该方法要在启动类里使用,不推荐。
@lmport
导入配置类,如果配置类没在启动类的包及其子包中,可以使用@lmport
读取配置文件,common.imports
public class CommonImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//读取配置文件的内容
List<String> imports = new ArrayList<>();
InputStream is = CommonImportSelector.class.getClassLoader().getResourceAsStream("common.imports");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = null;
try {
while((line = br.readLine())!=null){
imports.add(line);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (br!=null){
try {
br.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
return imports.toArray(new String[0]);
}
}
自定义注解
写一个EnableCommonConfig配置类,在启动类上添加自定义注解@EnableCommonConfig
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(CommonImportSelector.class)
public @interface EnableCommonConfig {
}
@Target 用于指定注解可以应用的地方,ElementType.TYPE 表示该注解可以应用在类、接口、枚举等类型声明上。
@Retention 则用于指定注解的生命周期,RetentionPolicy.RUNTIME 表示该注解会在运行时保留,因此可以通过反射机制获取到这个注解的信息。
注册条件
@ConditionalOnProperty
//注入Country对象
//如果配置文件中配置了指定的信息,则注入,否则不注入
@ConditionalOnProperty(prefix = "country",name = {"name","system"})
@Bean
public Country country(@Value("${country.name}") String name,@Value("${country.system}") String system){
Country country = new Country();
country.setName(name);
country.setSystem(system);
return country ;
}
@ConditionalOnMissingBean
//如果ioc容器中不存在Country,则注入Province,否则不注入
@Bean
@ConditionalOnMissingBean(Country.class)
public Province province(){
return new Province();
}
@ConditionalOnClass
@Bean
//如果当前环境中存在DispatcherServlet类,则注入Province,否则不注入
//如果当前引入了web起步依赖,则环境中有DispatcherServlet,否则没有
@ConditionalOnClass(name = "org.springframework.web.servlet.DispatcherServlet")
public Province province(){
return new Province();
}