【Spring 学习笔记(九)】Spring IoC/DI注解开发之纯注解开发

166 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

写在前面😘

大一电子信息工程新生,请多多关照,希望能在掘金记录自己的学习历程!
【Spring 学习笔记】 系列教程基于 Spring 5.2.10.RELEASE讲解

一、纯注解开发(Spring 3.x及以上)

在上篇文章Spring 原始注解中使用注解来配置bean,但是依然有用到配置文件(如在配置文件中的注解扫描)。

Spring在3.0版已经支持纯注解开发,即用Java类替代配置文件。下面来介绍下,在Spring 3中都有哪些新的注解代替了xml文件。

1️⃣开启纯注解功能

@Configuration

  • 类型:类注解
  • 位置:类定义上方。
  • 作用:设置当前类为 spring 核心配置类(替代了 spring 核心配置文件)

@ComponentScan

  • 类型:类注解
  • 位置:类定义上方。
  • 作用:开启注解扫描

案例👇

步骤1:创建配置类

创建一个配置类SpringConfig

public class SpringConfig {
}

步骤2:标识该类为配置类

在配置类上添加@Configuration注解,将其标识为一个配置类,替换applicationContext.xml

@Configuration
public class SpringConfig {
}
步骤3:用注解替换包扫描配置

在配置类上添加包扫描注解@ComponentScan替换<context:component-scan base-package="com.bighorn"/>

@Configuration
@ComponentScan("com.bighorn")
public class SpringConfig {
}
步骤4:创建运行类并执行
public static void main(String[] args) {
    //获取配置类初始化容器
    ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
    //从容器中获取对象
    User user = context.getBean(User.class);
    //打印bean
    System.out.println(user);;
}

运行结果如下,发现不需要编写xml文件,依旧能够获取bean。

image-20220607162636804

注意点

  • @ComponentScan注解用于设定扫描路径,此注解只能添加一次,可以用数组表示扫描包的位置
@ComponentScan({com.bighorn.service","com.bighorn.dao"})
  • 加载纯注解格式上下文对象,需要使用 AnnotationConfigApplicationContext
//加载配置类初始化容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
//加载配置文件初始化容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

2️⃣加载properties文件

@PropertySource

  • 类型:类注解

  • 位置:类定义上方。

  • 作用:加载 properties 文件中的属性值。

  • 说明:不支持 通配格式*,一旦加载,所有 spring 控制的 bean 中均可使用对应属性值

  • 相关属性

    • value(默认):设置加载的 properties 文件对应的文件名或文件名组成的数组

示例👇

/*加载jdbc.properties文件*/
@PropertySource(value="classpath:jdbc.properties")
public class DataSourceConfig {
    @Value("${jdbc.driver}")
    private String drive;
    ......
}

3️⃣加载第三方Bean

自己定义的bean(如User、UserDaoImpl),都是在自己开发的类上面写个注解就完成了(如@Controller@Service@Repository)。

但是有些第三方的类在jar包里,我们又不能在它们的源代码上面添加注解,所以这时候就要用到@Bean管理第三方bean了!

@Bean

  • 类型:方法注解

  • 位置:方法定义上方。

  • 作用:设置该方法的返回值作为 spring 管理的 bean 。

  • 注意:

    • 该注解用于替代 XML 配置中的静态工厂与实例工厂创建 bean,不区分方法是否为静态或非静态。
  • 相关属性

    value(默认):定义 bean 的访问 id 。

示例👇

/*加载第三方bean:DruidDataSource*/
@Bean
public DataSource dataSource(){
    DruidDataSource ds = new DruidDataSource();
    return ds;
}

4️⃣加载第三方配置类

@Import

  • 类型:类注解

  • 位置:类定义上方。

  • 作用:导入第三方配置类作为 spring 控制的资源。

  • 说明:

    • @Import 仅允许添加一次,可以使用数组的形式引入多个配置类

    • @Bean 所在的类可以使用导入的形式进入 spring 容器,无需声明为bean 。

案例👇

/*在Spring配置类中引入Jdbc的配置类*/
@Configuration
@Import({JdbcConfig.class})
public class SpringConfig {

}

二、综合案例:注解配置数据源

之前在spring学习笔记(七)讲过用xml形式管理第三方bean:Druid数据源。

现在冷饭新炒,用注解的形式试试看,加深一下对@PropertySource、@Bean、@Import的使用。

步骤1:导入druid等依赖

pom.xml文件里添加springdruidmysql驱动的依赖包

<dependencies>
    <dependency>
        <!--springframework框架-->
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    <!--Druid连接池-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.16</version>
    </dependency>
    <!--mysql 驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.28</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

步骤2:准备properties配置文件

resources下创建一个jdbc.properties文件,并添加对应的属性键值对

# 注册驱动,可以缺省,会根据url自动识别
jdbc.drive=com.mysql.cj.jdbc.Driver
# 数据库连接地址
jdbc.url=jdbc:mysql://127.0.0.1:3306/db
# 数据库管理员名称
jdbc.username=root
# 数据库密码
jdbc.password=123456

步骤3:创建DataSource配置类

在config包下创建DataSourceConfig 数据源配置类,使用注解@PropertySource("classpath:jdbc.properties")加载jdbc配置文件,使用注解@Bean("druidDataSource")将第三方bean——DruidDataSource放置到spring容器中

/*数据源配置类*/
// 加载jdbc.properties配置文件
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfig {
    //用SpEl表达式将属性注入
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
​
    // 将方法的返回值放置Spring容器中
    @Bean("druidDataSource")
    public DruidDataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

步骤4:创建spring核心配置类

使用注解@Import({DataSourceConfig.class}),加载第三方配置类——DataSourceConfig

/*Spring核心配置类*/
@Configuration
//引入DataSourceConfig数据源配置类
@Import({DataSourceConfig.class})
public class SpringConfig {

}

步骤5:编写运行程序

public static void main(String[] args) throws SQLException {
    //获取配置类初始化容器
    ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
    //从容器中获取DruidDataSource对象
    DruidDataSource druidDataSource = context.getBean("druidDataSource", DruidDataSource.class);
    //获取数据库链接
    DruidPooledConnection connection = druidDataSource.getConnection();
    //打印数据源信息
    System.out.println(connection);
}

运行结果如下👇

成功连接到了数据库👌

image-20220608151756101

写在后面🍻

感谢观看啦✨
有什么不足,欢迎指出哦💖
掘金的运营同学审核辛苦了💗