spring全注解配置与springBoot全注解配置

spring全注解配置

spring 全注解配置主要靠 java 类和一些注解,比较常用的注解有:
@Configuration :声明一个类作为配置类,代替 xml 文件
@Bean :声明在方法上,将方法的返回值加入 Bean 容器,代替 <bean> 标签
@value :属性注入
@PropertySource :指定外部属性文件,
我们接下来用 java 配置来尝试实现连接池配置:
首先引入 Druid 连接池依赖
<dependency>
    groupId>com.alibaba</groupId> 
    <artifactId>druid</artifactId> 
    <version>1.1.10</version> 
</dependency>
创建一个 jdbc.properties 文件,编写 jdbc 属性
jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://127.0.0.1:3306/lxs 
jdbc.username=root 
jdbc.password=123
然后编写代码:
@Configuration
 @PropertySource("classpath:jdbc.properties") 
public class JdbcConfig { 
	@Value("${jdbc.url}") 
	String url; 
	@Value("${jdbc.driverClassName}")
 	String driverClassName;
 	@Value("${jdbc.username}") 
	String username; 
	@Value("${jdbc.password}") 
	String password; 
	@Bean 
	public DataSource dataSource() { 
	DruidDataSource dataSource = new DruidDataSource(); 
	dataSource.setUrl(url); 
	dataSource.setDriverClassName(driverClassName); 
	dataSource.setUsername(username); 
	dataSource.setPassword(password); 
	return dataSource; 
      } 
}
解读:
声明我们 JdbcConfig 是一个配置类
@PropertySource :指定属性文件的路径是 : classpath:jdbc.properties
通过 @Value 为属性注入值
通过 @Bean dataSource() 方法声明为一个注册 Bean 的方法, Spring 会自动调用该方法,将方法的返回值
加入 Spring 容器中。默认的对象名 id= 方法名,可以通过 @Bean(" 自定义名字 ") ,来指定新的对象名
然后我们就可以在任意位置通过 @Autowired 注入 DataSource 了!
我们在 HelloController 中测试:
@RestController
 public class HelloController {
     @Autowired
     private DataSource dataSource;
     @GetMapping("hello") public String hello() {
     return "hello, spring boot!" + dataSource; 
           }
 }
然后 Debug 运行并查看:

springBoot全注解配置

在上面的案例中,我们实现了 spring 配置方式。不过属性注入使用的是 @Value 注解。这种方式虽然可行,但是不够 强大,因为它只能注入基本类型值。
SpringBoot 中,提供了一种新的属性注入方式,支持各种 java 基本数据类型及复杂类型的注入。
1 )我们新建一个 属性配置类 ,用来进行属性注入:
package com.lxs.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix ="jdbc")
public class JdbcProperties {
    private String url;
    private String driverClassName;
    private String username;
    private String password;


    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    private String password;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
在类上通过 @ConfifigurationProperties 注解声明当前类为属性读取类
prefix="jdbc" 读取属性文件中,前缀为 jdbc 的值。
在类上定义各个属性,名称必须与属性文件中 jdbc. 后面部分一致
需要注意的是,这里我们并没有指定属性文件的地址,所以我们需要把 jdbc.properties 名称改为
application.properties ,这是 SpringBoot 默认读取的属性文件名.
文件的创建路径:
蓝色的为spring全注解配置的类。
其他的为springBoot全注解配置的类。

既然有读取的属性的类,那么读取的属性读完,还得交给其他的类使用干活。
JdbcBootCoifig类 中使用这个属性:
package com.lxs.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


import javax.sql.DataSource;

@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcBootConfig {
    //默认的对象名是方法的名字    也可以通过输入指定方法的名字下面是例子
    @Bean
    public DataSource dataSource(JdbcProperties jdbc) {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(jdbc.getUrl());
        dataSource.setDriverClassName(jdbc.getDriverClassName());
        dataSource.setUsername(jdbc.getUsername());
        dataSource.setPassword(jdbc.getPassword());
        return dataSource;
    }
}
通过 @EnableConfigurationProperties(JdbcProperties.class) 来声明要使用 JdbcProperties 这个类的对 象。
然后你可以通过以下方式注入 JdbcProperties
1. @Autowired 注入
@Autowired private 
JdbcProperties prop;

2.构造函数注入

private JdbcProperties prop; 
public JdbcConfig(Jdbcproperties prop){
 this.prop = prop; 
}

3.声明有@Bean的方法参数注入

@Bean
 public Datasource dataSource(JdbcProperties prop){
 // ... 
}
本例中,我们采用第三种方式。
测试结果与spring全配置基本相同。

大家会觉得这种方式似乎更麻烦了,事实上这种方式有更强大的功能,也是 SpringBoot 推荐的注入方式。两者对比 关系:
Relaxed binding :松散绑定
不严格要求属性文件中的属性名与成员变量名一致。支持驼峰,中划线,下划线等等转换,甚至支持对 象引导。
比如:user.friend.name :代表的是 user 对象中的 friend 属性中的 name 属性,显然 friend 也是对象。@value 注解就难以完成这样的注入方式。
meta-data support :元数据支持,帮助 IDE 生成属性提示(写开源框架会用到)。

springBoot更优雅的注入

事实上,如果一段属性只有一个 Bean 需要使用,我们无需将其注入到一个类( JdbcProperties )中。而是直接在需 要的地方声明即可:
@Configuration
 public class JdbcConfig {
 @Bean
 // 声明要注入的属性前缀,SpringBoot会自动把相关属性通过set方法注入到DataSource中 

@ConfigurationProperties(prefix = "jdbc") 
public DataSource dataSource() { 
DruidDataSource dataSource = new DruidDataSource();
 return dataSource; 
    }
 }
我们直接把 @ConfigurationProperties(prefix = "jdbc") 声明在需要使用的 @Bean 的方法上,然后
SpringBoot 就会自动调用这个Bean (此处是 DataSource )的 set 方法,然后完成注入。使用的前
提是: 该类必须有对应属性的 set 方法!   
DruidDataSource类的内部方法:

 

由此可见是有get,和set方法的。
优雅的注入:
三部分:
1.application.properties文件    2.带有 @Configuration 注解的配置类 3.@ConfigurationProperties(prefix = "jdbc")

要求:属性文件中的名称 要和set方法中的属性 相同。

 
注入完成后,在controller类中使用
controller类中自动装载类
@Autowired
private DataSource dataSource;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值