使用Idea导入第三方jar包这种方法是不对的
使用maven命令导入jar包
官网下载maven
Maven – Download Apache Maven
解压缩后在命令行输入命令,注意看输出的结果,安装的是不是你本地的maven仓库
mvn install:install-file -Dfile="D:\common-pojo-2.0-SNAPSHOT.jar" -DgroupId=cn.itcast -DartifactId=common-pojo -Dversion=2.0 -Dpackaging=jar
在porn.xml种添加的第三方jar包依赖,并刷新
可以在启动类中尝试调用
以上放到启动类中,不推荐,建议创建一个专门定义的类
package com.geji.config;
import cn.itcast.pojo.Country;
import cn.itcast.pojo.Province;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
@Configuration
public class CommonConfig {
//注入Country对象
@Bean
public Country country(){
return new Country();
}
//对象默认的名字是方法名
@Bean
// @Bean(“aa”)也可以改默认的对象名
public Province province(){
return new Province();
}
}
在入口文件中调用(注意调用默认的是类名,也可以通过@Bean("aa")起别名)
以上因为在入口文件的同级目录下会自动扫描,所以可以直接用,如果不在同级目录,需要使用import
以上,如果有很多类,就会非常的臃肿,所以,做一些封装
定义一个文件
定义一个类实现ImportSelector接口,并且读取刚刚配置的文件
package config;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
//ctrl alt tal
//alt enter
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) {
e.printStackTrace();
} finally {
if(br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// return new String[]{"config.CommonConfig"};
return imports.toArray(new String[0]);
}
}
以上,可以通过在启动类添加@import(CommonImportSelector )注解调用,但是后面有可能还有其他注解,进一步对注解进行封装,创建注解类
package anno;
import config.CommonImportSelector;
import org.springframework.context.annotation.Import;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//表示可以在类上面使用
@Target(ElementType.TYPE)
//表示运行时可用
@Retention(RetentionPolicy.RUNTIME)
@Import(CommonImportSelector.class)
public @interface EnableCommonConfig {
}
入口文件调用注解类
运行成功
Bean的注册条件
以上类没有实例化数据,没什么用,如果要实例化的话,一般通过配置文件的方式
配置文件添加数据
在类中读取配置文件实例化类并返回数据
@Configuration
public class CommonConfig {
//注入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;
}
以上如果配置文件中没有,则会报错,所以需要添加注册条件的注释,常用的有以下几种
@ConditionalOnProperty | 配置文件中存在对应的属性,才声明该bean |
@ConditionalonMissingBean | 当不存在当前类型的bean时,才声明该bean |
@Conditionalonclass | 当前环境存在指定的这个类时,才声明该bean |
这部分内容纯了解,举第一个为例子
配置文件中注释掉相应的数据
原本代码会报错
但是添加就好了
@ConditionalOnProperty(prefix="country",name = {"name","system"})