目录
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 {@Overridepublic 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"})@Beanpublic 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();}