1.springboot的配置文件:
分别为:yml 与 properties两种配置
第一种:全局的配置文件 application.yml
第二种:全局的配置文件 application.properties
小总结:使用这两个配置时,配置文件内的对象的字段要与实体类中的属性进行绑定,让其保持一致,不然启动报错。
文章目录
1.1 yml配置文件的格式 key: value
(1). 不同数据在yml里面的定义格式?
(2). 回顾spring里面属性注入的方式?
1. get set方式注入:
<bean id="user" class="com.yousian.pojo.User">
<property name="username" value="eric"></property>
<property name="password" value="1234"></property>
</bean>
2.构造函数的注入:
<bean id="user" class="com.yousian.pojo.User">
<constructor-arg name="username" value="eric">
</constructor-arg>
<constructor-arg name="password" value="1234">
</constructor-arg>
</bean>
3.P名称空间的注入
4.SpringEL表达式的注入
5.注解的方式注入有: @Value @Resource @AutoWired
2.springboot中如何注入属性的?
一,第一种方式:
1. 编写一个pojo类,用来绑定配置文件里面定义的属性值 在application.yml里面定义属性(属性的名称必须要和pojo类里面的属性保持一致)进行绑定的操作 使用 2. @ConfigurationProperties(prefix="person")代码如下(示例):
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
//1.提供get() set方法,
//2.为了方便测试,提供toString()方法
}
编写后台,并开启启动类,代码如下(示例):
//1.开启启动类
@SpringBootApplication
public class App {
public static void main(String[] args){
SpringApplication.run(App.class,args);
}
}
//2.访问Controller层的数据路径
//注入实体类
@Autowired
Person person;
@RequestMapping("/per")
public Person hello(){
System.out.println(person);
return person;
}
二,第二种方式:
在Properties文件中配置里面属性值与pojo中的属性名 进行绑定,让其保持一致。通过@Value()注解进行传参访问。
代码如下(示例):
//1.pojo实体类
@Component
public class Emp {
@Value("${emp.empName}")
public String empName;
/*@Value("${emp.age}")*/ /*直接获取值*/
@Value("#{10+10}")/*可以进行加法计算*/
public Integer age;
@Value("${emp.isMarried}")
private boolean isMarried;
//1.提供get() set方法,
//2.为了方便测试,提供toString()方法
}
#2.Properties文件
server.port=9999
person.last-name= Candy糖豆
person.age=8
person.birth=2019/12/30
person.boss=false
person.lists=a,b,c
person.maps.k1=value1
person.maps.k2=value2
person.dog.name= 豆豆
person.dog.age=1
注意!!!:无论是在yml文件还是Properties文件内,#代表的是注释。在执行Properties文件时,该文件如果与yml文件同时存在,那么访问路径优先于Properties文件,如果想要访问yml文件,记得把Properties文件加上注释。
3.访问Controller层的数据路径
/*注入实体类*/
@Autowired
Emp emp;
@RequestMapping("/emp")
public Emp Testemp(){
System.out.println(emp);
return emp;
}
3.数据校验:
1.使用注解@ConfigurationProperties时,需要在实体类上该注解下,加上一个@Validated(数据校验)。
2.在邮箱属性名上加上@Email注解
代码如下(示例):
//1.pojo实体类
@Component
public class Emp {
@Value("${emp.empName}")
public String empName;
/*@Value("${emp.age}")*/ /*直接获取值*/
@Value("#{10+10}")/*可以进行加法计算*/
public Integer age;
@Emila
public String email;//email必须是邮箱格式
@Value("${emp.isMarried}")
public boolean isMarried;
//1.提供get() set方法,
//2.为了方便测试,提供toString()方法
}
#2.emila只能有邮箱格式
emp:
empName: 皮蛋
age: 3
isMarried: true
emila: zhangsan@Boss.com
小总结:
1.通过比较@ConfigurationProperties和@Value的区别:
1.1最大的区别就是@ConfigurationProperties支持数据校验,而@Value则不支持。
2.配置文件无论是yml还是properties他们都能获取到值;
3.如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value; 如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
4.@PropertySource与@ImportResource
1.@PropertySource
在前面的配置中,使用@ConfigurationProperties注解可以获取配置文件中的属性值。但是@ConfigurationProperties读取的配置文件是全局的,也就是说这个注解只能加载全局的配置文件(application.yml/application.properties).但是全局配置文件一般定义的都是有关spring配置的信息。如果我们需要定义一些与spring配置无关的信息,那么该如何呢?
我们可以定义局部的配置文件,然后使用@PropertySource注解进行获取。
代码如下(示例):
#1.propertySource文件
emp:
empName: 皮蛋
age: 3
isMarried: true
emila: zhangsan@Boss.com
#2.实体类
@Component
@propertySource(value={"classpath:emp.properties"})
@ConfigurationProperties(prefix = "emp")
public class Emp {
@Value("${emp.empName}")
public String empName;
/*@Value("${emp.age}")*/ /*直接获取值*/
@Value("#{10+10}")/*可以进行加法计算*/
public Integer age;
@Emila
public String email;//email必须是邮箱格式
@Value("${emp.isMarried}")
public boolean isMarried;
//1.提供get() set方法,
//2.为了方便测试,提供toString()方法
}
2.@ImportResource
导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别; 想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上
实例:
定义一个UserSercice方法,使用xml配置文件的方式管理UserService类。如何在springboot项目中获取?
1.定义UserService
public class UserService {
public void test(){
System.out.println("这是UserService里面的方法");
}
}
定义bean.xml配置文件,管理bean
在启动类上添加@importResource注解
@SpringBootApplication
@ImportResource(locations = {“classpath:bean.xml”})//加载类路径下面的配置文件
启动类
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
测试
@RestController
public class controller {
@Autowired
ApplicationContext applicationContext;
@RequestMapping("/hello")
public String hello(){
UserService userService = (UserService) applicationContext.getBean("userService");
userService.test();
return "这是我的第一个springboot程序";
}
}
注意!!!:在springboot项目中,我们在spring容器中添加组件,我们一般不用以上使用xml的方式。Springboot推荐我们使用全注解的方式在spring容器添加组件。
1、配置类@Configuration------>Spring配置文件
2、使用@Bean给容器中添加组件
定义OrderService
public class OrderService {
public void test(){
System.out.println("这是OrderService里面的方法");
}
}
定义配置类
package com.oracle.config;
import com.oracle.service.OrderService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
/**
* 指明当前类就是一个配置类,用来替代之前的配置文件<bean class=""></bean>
*/
public class MyAppConfig {
//将方法的返回值添加到spring容器中,组件的默认id就是当前方法名
@Bean
public OrderService orderService(){
return new OrderService();
}
}
测试调用
@RestController
public class controller {
@Autowired
ApplicationContext applicationContext;
@RequestMapping("/hello")
public String hello(){
OrderService userService = (OrderService) applicationContext.getBean("orderService");
userService.test();
return "这是一个springboot程序";
}
}
5.springboot整合log4j日志记录
1.在resources目录下面创建并引入log4j.properties日志文件
#log4j.rootLogger=CONSOLE,info,error,DEBUG
log4j.rootLogger=info,error,CONSOLE,DEBUG
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold = info
log4j.appender.info.append=true
#log4j.appender.info.File=/home/admin/pms-api-services/logs/info/api_services_info
log4j.appender.info.File=/Users/dddd/Documents/testspace/pms-api-services/logs/info/api_services_info
log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.error.datePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold = error
log4j.appender.error.append=true
#log4j.appender.error.File=/home/admin/pms-api-services/logs/error/api_services_error
log4j.appender.error.File=/Users/dddd/Documents/testspace/pms-api-services/logs/error/api_services_error
log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout
log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd
log4j.appender.DEBUG.Threshold = DEBUG
log4j.appender.DEBUG.append=true
#log4j.appender.DEBUG.File=/home/admin/pms-api-services/logs/debug/api_services_debug
log4j.appender.DEBUG.File=/Users/dddd/Documents/testspace/pms-api-services/logs/debug/api_services_debug
log4j\u4EE3\u7801
private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
2.引入log4j.properties依赖
<!-- springboot-log4j -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
3.编写Controller测试日志是否打印
@RestController
public class LoggController {
private static final Logger logger = LoggerFactory.getLogger(LoggController.class);
@RequestMapping("/printLog")
public String printLog(){
logger.info("打印日志......");
return "Hello World.....";
}
}
6.拓展:在spring中如何管理bean?
1.无参数的构造函数
2.静态实例化工厂
3.实例化工厂
4.注解 @Controller @Service ....
5.Java配置类的方式管理bean
5.1定义一个bean
5.2定义一个配置类(@Configuration修饰一个类)
5.3在类里面定义一个方法(专门用来管理bean的)