Spring Boot配置和注解注入的方式

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的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值