写点什么

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

作者:倔强的牛角
  • 2022 年 6 月 10 日
  • 本文字数:3068 字

    阅读完需:约 10 分钟

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

写在前面😘

大一电子信息工程新生,请多多关照,希望能在 InfoQ 社区记录自己的学习历程!

【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


@Configurationpublic 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。


注意点

  • @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*/@Beanpublic 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);}
复制代码


运行结果如下👇


成功连接到了数据库👌


写在后面🍻

感谢观看啦✨

有什么不足,欢迎指出哦💖

发布于: 刚刚阅读数: 3
用户头像

把学问造就,还期身健行优。 2022.06.02 加入

大一在读,电子信息工程专业。 希望在InfoQ写作社区记录自己的学习历程!

评论

发布
暂无评论
【Spring 学习笔记(九)】Spring IoC/DI注解开发之纯注解开发_Java_倔强的牛角_InfoQ写作社区