【注意点:虽然springboot支持多种格式配置文件,但是在项目开发是,推荐统一使用一种格式的配置(yml是直流)】
优先级:application.properties->application.yml->application.yaml
命令行参数 -> Java系统属性
java -Dserver.port=9000 -jar .....jar --server.port=10010
【注意:springboot项目进行打包时,需要引入插件 spring-boot-maven-plugin(基于官网骨架创建项目,会自动添加该插件)】
默认情况下,Spring项目启动时,会吧bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过:
Object getBean(String name);
<T> T getBean(Class<T> requiredType);
<T> T getBean(String name,Class<T> requiredType);
@Autowired
private ApplicationContext context; //IOC容器
@Autowired
private SAXReader saxReader;
//获取bean对象
@Test
public void testGetBean(){
//根据bean的名称获取
DeptController deptController = (DeptController) context.getBean("deptController");
System.out.println(deptController);
//根据bean的类型获取
DeptController deptController2 = context.getBean(DeptController.class);
System.out.println(deptController2);
//根据bean的名称 及 类型获取
DeptController deptController3 = context.getBean(DeptController.class,"deptController");
System.out.println(deptController3);
}
【注意点:spring项目启动时,会吧其中的bean都创建好,但其还会受到作用域及延迟初始化影响】
//@Lazy //延迟初始化:使用的时候才会实例化
@Scope("prototype") //设置bean的作用域
@RestController
@RequestMapping("/depts")
public class DeptController {
....
}
@Configuration
public class CommonConfig {
//声明第三方bean
@Bean //将当前方法的返回值对象交给IOC容器管理,称为IOC容器bean
public SAXReader saxReader(DeptService deptService){//自动注入deptService
System.out.println(deptService);
return new SAXReader();
}
}
当使用到其它模块的类时,可以将该模块的依赖放入需要项目的pom.xml文件当中
之后在项目的启动类中使用@ComponentScan来扫描引入依赖的包
@SpringBootApplication
@ComponentScan({"com.itheima","com.example"})
public class SpringbootWebConfig2Application {
public static void main(String[] args) { SpringApplication.run(SpringbootWebConfig2Application.class, args);
}
}
自动配置原理
方法二:@Import导入,使用@Import导入的类会被spring加载到IOC容器中,导入形式:
导入普通类
导入配置类
@SpringBootApplication
//@ComponentScan({"com.itheima","com.example"})
//@Import({TokenParser.class}) //导入普通类 交给IOC容器
//@Import({HeaderConfig.class}) //导入配置类,交给IOC容器
//@Import({MyImportSelector.class}) //导入ImportSelector接口实现类
public class SpringbootWebConfig2Application {
public static void main(String[] args) {
SpringApplication.run(SpringbootWebConfig2Application.class, args);
}
}
@SpringBootApplication:该注解标识在SpringBoot工程引导类上,是SpringBoot中非常重要的注解,由三个部分组成
@Conditional
@Bean
@ConditionalOnClass(name = "io.jsonwebtoken.Jwts")//坏境中存在指定的找个类,才会吧该bean加入IOC容器
public HeaderParser headerParser(){
return new HeaderParser();
}
@ConditionalOnMissingBean //不存在该类型的bean 才会将该bean加入到IOC容器当中 ---指定类型(value属性) 或名称(name属性)
@ConditionalOnProperty(name="name",havingValue = "haonan") //配置文件中存在指定的属性与值,才会将bean添加到IOC容器当中
目的
创建模块aliyun-oss-spring-boot-autoconfigure和aliyun-oss-spring-boot-starter
在autoconfigure模块中,导入需要用到的阿里云依赖,放入工具类和OSS配置类
@Component
public class AliOSSUtils {
@Autowired
private AliOSSProperties aliOSSProperties;
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
//获取AliOSSProperties中的属性值
String endpoint = aliOSSProperties.getEndpoint();
String accessKeyId = aliOSSProperties.getAccessKeyId();
String accessKeySecret = aliOSSProperties.getAccessKeySecret();
String bucketName = aliOSSProperties.getBucketName();
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//上传文件到 OSS
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径
String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
}
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
去掉不需要的注解,因为不会进行扫描包,而是引入依赖的形式,两个类上面的@Component注解来标识注入bean已经没用,所以丢掉
【Utils】
public class AliOSSUtils {
private AliOSSProperties aliOSSProperties;
public AliOSSProperties getAliOSSProperties() {
return aliOSSProperties;
}
public void setAliOSSProperties(AliOSSProperties aliOSSProperties) {
this.aliOSSProperties = aliOSSProperties;
}
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
//获取AliOSSProperties中的属性值
String endpoint = aliOSSProperties.getEndpoint();
String accessKeyId = aliOSSProperties.getAccessKeyId();
String accessKeySecret = aliOSSProperties.getAccessKeySecret();
String bucketName = aliOSSProperties.getBucketName();
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//上传文件到 OSS
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径
String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
}
【properties】
@Data
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
@Configuration
@EnableConfigurationProperties(AliOSSProperties.class)
public class AliOSSAutoConfiguration {
@Bean
public AliOSSUtils aliOSSUtils(AliOSSProperties aliOSSProperties){
AliOSSUtils aliOSSUtils = new AliOSSUtils();
aliOSSUtils.setAliOSSProperties(aliOSSProperties);
return aliOSSUtils;
}
}
@RestController
public class UploadController {
@Resource
private AliOSSUtils aliOSSUtils;
@PostMapping("/upload")
public String upload(MultipartFile image) throws Exception {
//上传文件到阿里云 OSS
String url = aliOSSUtils.upload(image);
return url;
}
}