1.@Configuration注解
从Spring3.0 @Configuration注解用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。源码如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
String value() default "";
}
从源码定义来看,@Configuration 注解本质上还是@Component,因此< context:component-scan/> 或者 @ComponentScan注解都能处理@Configuration注解的类。@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的< beans>标签,作用为:配置spring容器(应用上下文)
在springboot项目中建立dbconfig类
package com.soft.fire.config;
import org.springframework.context.annotation.Configuration;
/**
* 数据库配置
*
* @author David Lin
* @version: 1.0
* @date 2019-03-10 11:53
*/
@Configuration
public class DbConfig {
public DbConfig(){
System.out.println("dbconfig 启动初始化了 !!!----------------------");
}
}
启动项目之后 控制台日志如下:
相当于xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
</beans>
2.@Bean注解
用来向容器注册一个bean,@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。Bean的类型由方法返回值类型决定,名称默认和方法名相同,也可以通过入参显示指定Bean名称。源码如下:
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
@AliasFor("name")
String[] value() default {};
@AliasFor("value")
String[] name() default {};
Autowire autowire() default Autowire.NO;
String initMethod() default "";
String destroyMethod() default "(inferred)";
}
(1)通过@Configuration+@Bean注册Bean,如下:
@Configuration
public class DbConfig {
public DbConfig(){
System.out.println(" dbconfig 启动初始化!!---------------");
}
@Bean
public Person person(){
return new Person();
}
}
在Controller中注入Person对象进来使用person,ide使用lombok插件和依赖
@Data
public class Person {
private String name = "smith";
private int age = 23;
}
@Controller
@RequestMapping("/common")
public class CommonController {
@Resource
private Person person;
@GetMapping("/person")
@ResponseBody
private Person getPerson(HttpServletRequest request){
return person;
}
访问结果如下:
(2)使用@Configuration+@Component注册Bean
@Configuration
@ComponentScan(basePackages = "com.soft.core.model")
public class DbConfig {
public DbConfig(){
System.out.println(" dbconfig 启动初始化!!---------------");
}
/* @Bean
public Person person(){
return new Person();
}*/
}
@Data
@Component
public class Person {
private String name = "smith";
private int age = 23;
}
Controller访问运行结果和第一种是一样的。
通过@Configuration和@Bean注解注册的实体,适合在需要注入第三方类库的时候使用。将第三方类库设置自定义属性值之后 再注册到容器里面 ,可以注入到需要的地方。
3.@ComponentScan注解
@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到Spring的bean容器中。
- @Configuation等价于XML配置的< beans></ beans>标签
- @Bean等价于XML配置的 < bean></ bean>标签
- @ComponentScan等价于<context:component-scan base-package=“com.soft.xxx.xxx” />标签
4.@Value注解
该注解的作用是将我们配置文件的属性读出来,有@Value(“${}”)和@Value(“#{}”)两种方式。如果要在Spring MVC 中使用该注解,需要在mvc配置文件中添加相应的配置。因为还有一个applicationContext配置文件。在Controller中使用@Value注解如下:
my.properties文件
my.name=大卫
my.age = 23岁
my.sex = 男
spring-servlet.xml配置如下
<context:property-placeholder location="classpath:conf/*.properties"/>
Controller代码如下:
@Controller
@RequestMapping("/common")
public class CommonController {
@Value("${my.name}")
private String userName;
@GetMapping("/user")
@ResponseBody
public String getUserName(){
return userName;
}
访问结果如下:
5.@ConfigurationProperties注解
该注解需要在Spring Boot环境中使用。该注解将自定义的properties文件映射到实体bean中。Spring Boot默认使用yml中的配置,但有时候要用传统的xml或properties配置,就需要依赖spring-boot-configuration-processor:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
(1)如果该注解加在类上需要和@Component注解一起使用
application.properties内容如下:
server.port=8888
server.servlet.context-path=/
server.tomcat.uri-encoding=utf-8
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
jdbc.username=scott
jdbc.password=tiger
JdbcConfig类
/**
* 数据库相关配置
*
* @author David Lin
* @version: 1.0
* @date 2019-03-10 20:47
*/
@Component
@ConfigurationProperties(prefix = "jdbc")
@Setter
@Getter
public class JdbcConfig {
/**
* 驱动类名称
*/
private String driverClassName;
/**
* 数据库地址
*/
private String url;
/**
* 数据库账号
*/
private String username;
/**
* 数据库密码
*/
private String password;
}
将配置类注入到Controller类里面使用
@RestController
public class CommonController {
@Resource
private JdbcConfig jdbcConfig;
@GetMapping("/jdbc")
public JdbcConfig getJdbcConfig(HttpServletRequest request){
return jdbcConfig;
}
访问结果如下:
(2)如果该注解加在方法上需要和@Bean注解一起使用
定义一个JdbcProperties类
/**
* 数据库属性对象
*
* @author David Lin
* @version: 1.0
* @date 2019-03-10 21:42
*/
@Setter
@Getter
public class JdbcProperties {
/**
* 驱动类名称
*/
private String driverClassName;
/**
* 数据库地址
*/
private String url;
/**
* 数据库账号
*/
private String username;
/**
* 数据库密码
*/
private String password;
}
@Configuration
public class JdbcConfig {
//或者把该方法放在启动类里面也是可以的
@Bean
@ConfigurationProperties(prefix = "jdbc")
public JdbcProperties jdbcProperties(){
return new JdbcProperties();
}
}
@RestController
public class CommonController {
@Resource
private JdbcProperties jdbcProperties;
@RequestMapping("/jdbc")
public JdbcProperties getJdbcProperties(HttpServletRequest request){
return jdbcProperties;
}
运行结果如下:
6.@PropertySource注解
该注解用来指定要读取的配置文件的路径,从而读取这些配置文件,可以同时指定多个配置文件,通常和@Value、@Component注解一起使用。功能和< context:property-placeholder location=“classpath:conf/*.properties”/>一样。在非Spring Boot环境中,将属性配置封装到实体对象里面。
/**
* 数据库配置
*
* @author David Lin
* @version: 1.0
* @date 2019-03-10 11:04
*/
@Component
@PropertySource(value = "classpath:conf/jdbc.properties")
@Setter
@Getter
public class DbConfig {
/**
* 驱动类名称
*/
@Value("${jdbc.driverClassName}")
private String driverClassName;
/**
* 数据库地址
*/
@Value("${jdbc.url}")
private String url;
/**
* 数据库账号
*/
@Value("${jdbc.username}")
private String username;
/**
* 数据库密码
*/
@Value("${jdbc.password}")
private String password;
}
@Controller
@RequestMapping("/common")
public class CommonController {
@Resource
private DbConfig dbConfig;
@Value("${my.name}")
private String userName;
@GetMapping("/user")
@ResponseBody
public String getUserName(){
return userName;
}
@GetMapping("/jdbc")
@ResponseBody
public DbConfig getConfig(HttpServletRequest request){
return dbConfig;
}
访问结果如下:
1.这几篇作者写的不错,放在这里参考引用: springmvc零XML配置.
spring boot2配置: spring boot2 配置.
Spring:Value取不到值.