spring 认证--3--Spring DI--IOC与DI解耦/使用Properties文件

接上一章节:https://blog.csdn.net/weixin_58580280/article/details/120145452

一  @Bean与@Component联用,也可以提高编码效率

方案1:@Bean组件注入到@Component组件中

 第一步:spring4工程利用@Bean在配置类Config中声明组件

package cn.tedu.context;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import java.util.Date;

@Configuration
@ComponentScan("cn.tedu.demo")//配置类扫描包,spring为其包下的类创建对象
public class Config {
    @Bean
    public Date currentDate(){
        return new Date();
    }
}

第二步:利用@Component声明组件,注入Date类型组件

package cn.tedu.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class Employee {
    private String name="Tom";
    @Autowired
    private Date date;

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", date=" + date +
                '}';
    }
}

第三步:TestCase类中测试

 @Test
    public void testEmployee(){
        /*测试 @Bean 声明的组件注入到 @Component声明的组件*/
        Employee employee =ctx.getBean("employee",Employee.class);
        System.out.println(employee);//Employee{name='Tom', date=Tue Sep 07 21:42:22 CST 2021}
    }

方案2:@Component 组件注入到@Bean 组件中 ,效果一样

第一步: demo包下创建Dept部门类,提供set方法和和toString()

package cn.tedu.demo;

public class Dept {

    private String name = "Java教研部";

    private Employee manager;

    public void setManager(Employee manager) {
        this.manager = manager;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "name='" + name + '\'' +
                ", manager=" + manager +
                '}';
    }
}

第二步: Config类添加部门对象,使@Component组件下的参数注入到@Bean组件的对象方法中

  @Bean
    public Dept dept(Employee employee){//参数是@Component组件下的参数
        Dept dept = new Dept();
        dept.setManager(employee);//通过参数把employee注入到manager中
        return dept;
    }

第三步:测试效果,效果和方案1 一样

@Test
    public void testDept(){
        /*测试 @Component 声明的Bean组件注入到@Bean声明的组件中*/
        Dept dept = ctx.getBean("dept", Dept.class);
        System.out.println(dept);
Dept{name='Java教研部', manager=Employee{name='Tom', date=Tue Sep 07 22:38:16 CST 2021}}

    }

二 使用Properties文件

1 Druid 连接池

 第一步: spring4工程pom文件添加druid数据库连接池依赖以及mysql连接驱动依赖

注意mysql连接依赖的版本

       <!--数据库连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.21</version>
        </dependency>
        <!--数据库连接-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

第二步: Config类创建jdbc连接驱动,查询sql语句

 @Bean(initMethod = "init",destroyMethod = "close")//标注初始化方法和销毁方法
    public DataSource dataSource(){
        DruidDataSource ds=new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/mysql?" +
                "characterEncoding=utf8&useSSL=false&serverTimezone=UTC&" +
                "rewriteBatchedStatements=true");
        ds.setUsername("root");
        ds.setPassword("root");
        ds.setMaxActive(10);
        ds.setInitialSize(2);
        return ds;
    }

第三步:TestCase包下测试,结果是: Hello World !  说明连接数据库成功并查询数据成功

 @Test
    public void testDataSource(){
        /* 测试数据库连接池是否能够成功连接到数据库*/
        String sql = "select 'Hello World !'";
        DataSource ds = ctx.getBean("dataSource", DataSource.class);
        try(Connection conn = ds.getConnection()) {

            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while(rs.next()){
                System.out.println(rs.getString(1));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

总结:缺点就是连接数据库时的url设置繁琐,容易出错!

2  @PropertySource 注入 Environment 对象

    程序参数经常保存到properties文件中,Spring提供了@PropertiesSource注解用于读取Properties文件,读取后保存到Environment 对象中,可以在程序中注入Environment 对象,就可以获得配置文件中的信息了.

 第一步:resources包下编辑数据库配置文件,可从下图网址下载,解压后复制粘贴进resources包下

 

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
db.username=root
db.password=root
db.maxActive=10
db.initialSize=2

 第二步:Config配置类添加@PropertySource注解指定配置文件,通过注入到Environment对象进行使用

@Configuration

@PropertySource("classpath:jdbc.properties")//配置文件来源
public class Config {

    @Autowired
    Environment env;//配置文件注入到env对象中

    @Bean(initMethod = "init",destroyMethod = "close")//此时初始化方法和销毁方法可写/可不写
    public DataSource dataSource2(){
        DruidDataSource ds=new DruidDataSource();
        ds.setDriverClassName(env.getProperty("db.driver"));
        ds.setUrl(env.getProperty("db.url"));
        ds.setUsername(env.getProperty("db.username"));
        ds.setPassword(env.getProperty("db.password"));
        ds.setMaxActive(env.getProperty("db.maxActive",Integer.class));//字符串类型转为Integer类型
        ds.setInitialSize(env.getProperty("db.initialSize",Integer.class));
        return ds;
    }
......

第三步:测试@PropertySource注解能否读取到jdbc.properties文件,并连接数据库查询成功?

 @Test
    public void testDataSource2(){
        /*测试 @PropertySource 读取 properties*/
        String sql = "select 'Hello World !'";
        DataSource ds = ctx.getBean("dataSource2", DataSource.class);
        try(Connection conn = ds.getConnection()) {
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while(rs.next()){
                System.out.println(rs.getString(1));
            }
        }catch (Exception e){
            e.printStackTrace();
        }

控制台:成功

 3 @Value 读取系统环境Environment中的信息,注入到变量中,此方式更加灵活方便

 第一步: Config配置类使用@PropertySource和@Value注解,将配置文件注入到@Value注解的方法

参数中

@Configuration
@PropertySource("classpath:jdbc.properties")//配置文件来源
public class Config {

    @Bean
    public DataSource dataSource3(
            @Value("${db.driver}") String driver,
            @Value("${db.url}") String url,
            @Value("${db.username}") String username,
            @Value("${db.password}") String password,
            @Value("${db.maxActive}") int maxActive,
            @Value("${db.initialSize}") int initialSize){
        DruidDataSource ds=new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        ds.setMaxActive(maxActive);
        ds.setInitialSize(initialSize);
        return ds;
    }
.....
}

第二步:测试类编辑测试

 @Test
    public void testDataSource3(){
        /*测试 @Value读取properties*/
        String sql =" select 'Hello World!'";
        DataSource ds = ctx.getBean("dataSource3", DataSource.class);
        try(Connection conn=ds.getConnection()) {
            Statement statement = conn.createStatement();
            ResultSet rs = statement.executeQuery(sql);
            while(rs.next()){
                System.out.println(rs.getString(1));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


版权声明:本文为weixin_58580280原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。