Spring---- Spring注解开发(二)

上一篇👉:Spring---- Spring注解开发(一)



🚴大家好!我是近视的脚踏实地,后边这系列是自己自学Spring框架的学习笔记,这篇文章继续学习关于Spring注解开发的相关知识,首先是学习Spring配置数据源
     唯有行动  才能解除你所有的不安

2.2 Spring新注解

在这里插入图片描述

(那么学习新注解之前,再来看看之前代码,大部分以及使用注解完成了配置,但是回到Spring的主配置文件中,如上图☝️:,有一些配置,按照目前原始注解是没法替代的,首先看加载外部配置文件,肯定是不能在其他类或方法上使用注解来替代,因为没学过这么一个注解,然后看到bean的配置,那么bean的配置我们是可以用注解来替代的,但是想想刚才那些dao也好service也好都是我们自定的bean,自定义的话源码就是我们自己写的,我们当然可以在源码上任意加东西,加注解。所以这里的问题就是这个数据源的bean不是我们定义的,而是第三方定义的,意味着给我们的是一个jar包,那源码我们是肯定不能修改的了,那更别说加什么注解了,所以说原始注解对这些非自定义的bean就束手无策了,比如说刚才的Component就无法把ComboPooledDataSource数据源进行一些实例化,所以就需要我们去学新注解,后边的那个组件扫描也一样没有对应的注解 )

使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:
● 非自定义的Bean的配置:<bean>
● 加载properties文件的配置:<context:property-placeholder>
● 组件扫描的配置:<context:component-scan>
● 引入其他文件:<import>

那么具体解决的新注解如下表👇:

注解说明
@Configuration用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解
@ComponentScan用于指定 Spring 在初始化容器时要扫描的包。
作用和在 Spring 的 xml 配置文件中的
<context:component-scan base-package=“monster.zf”/>一样
@Bean使用在方法上,标注将该方法的返回值存储到 Spring 容器中
@PropertySource用于加载.properties 文件中的配置
@Import用于导入其他配置类

替代配置文件我们有这么一个思想,就是要用一个核心配置的类,就是借一个类去替代xml文件,所以这里再创建一个config包,在包里边创建一个SpringConfiguration ,然后在这个类上加上一个@Configuration注解,那么这就标志该类是Spring的核心配置类,不要配置文件不意味着没有配置,这个配置只是用一个类去代替文件,用注解的方式去代替标签,它是这么一个思想,所以配置还是有的
在这里插入图片描述

那么首先来看组件扫描,里边的就是要扫描的包及其子包
在这里插入图片描述
接着来看非自定义的bean,那么我们可以在配置类中写一个方法,这个方法的返回值就是你想要放到容器中bean的对象,写完方法后,你还要让Spring知道,让它把这个方法的返回值放进容器中,所以在上边加一个@Bean注解,当然如果你想为这个放到容器当中的对象去起个名字的话就加一个参数👇:
在这里插入图片描述
那么我们再和配置文件进行对比,xml中配置的value不是写死的,而是去加载properties配置文件,然后使用spEL表达式来读取的,但是上边的代码中是写死的,这代码又耦合了,一下回到了解放前,所以就意味着我们这个配置类也要能去加载properties配置文件,那么就可以使用@PropertySource注解👇: 里边的参数直接是之前location属性的值
在这里插入图片描述
那么引入properties文件后要怎么使用呢,能不能像在配置文件中直接使用spEL表达式呢?那么当然是不可以的了,在xml文件中可以解析spEL表达式,而我们这个地方是个api,那个${jdbc.url}就是个字符串,这么写它不会解析的。那么首先现在jdbc.properties这个文件是在Spring容器中的,因为已经注解配置了,那么既然在容器就可以注入,所以可以按照如下来搞👇:
在这里插入图片描述

接着来说import,就是引入,文件如果特别大的话,把文件挪开,那么如果核心配置类也特别大,是不是也得挪, 负责某一块的单独写,最后引入。比如说现在里边的加载properties配置文件,DataSource的bean的方法都是属于数据源的配置,那么我们就可以字啊config包中再建一个DataSourceConfiguration,用来专门负责数据源相关配置的,所以就要从核心配置类中把跟数据源相关的挪过去👇:

//<context:property-placeholder location="classpath:jdbc.properties"/>
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfiguration {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;


    @Bean("dataSource") //Spring会将当前方法的返回值以指定名称存储到Spring容器当中
    public DataSource getDataSource() throws PropertyVetoException {
        //1.获取数据源对象
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //2.设置基本的连接参数
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);
        return dataSource;
    }

}

然后核心配置类就变成这样👇:
在这里插入图片描述
那么SpringConfiguration是我们的核心配置类,DataSourceConfiguration就是分的,那最终在加载时,我们加载的是核心配置类,分的就没有被加载,所以就通过import注解把分的配置加到主的配置中👇:,如果有多个要引入,可以用逗号隔开,如果只需要引入一个,则可以不写数组的括号
在这里插入图片描述

那么到这里我们就用注解完全替代xml文件,然后到UserController测试中,修改一下代码,因为现在充当核心配置的不再是xml文件,而是我们的配置类,所以作如下修改👇:
在这里插入图片描述
运行结果👇:
在这里插入图片描述
那么这就是我们的新注解,学完新注解再结合之前的原始注解我们就可以进行全注解开发了,就意味着在开始时,我们一个配置文件都可以不要。起初我们注解用的不是特别多,但学到后边的SpringBoot之后是0配置的,注解用的就多一些。

3.Spring集成Junit

3.1 原始Junit测试Spring的问题

在测试类中,每个测试方法都有以下两行代码:

        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = app.getBean(UserService.class);

这两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常。所以又不能轻易删掉。

3.2 上述问题解决思路

● 让SpringJunit负责创建Spring容器,但是需要将配置文件的名称告诉它
● 将需要进行测试Bean直接在测试类中进行注入
(之前每次在写测试代码的时候,都需要getBean,多麻烦,那么在测试中你用什么就注入什么那就很方便了,比如说我要测Service,直接把它注入进去直接测就完了)

3.3 Spring集成Junit步骤

1️⃣:导入spring集成Junit的坐标
2️⃣:使用@Runwith注解替换原来的运行期
(就是原先我们在测试的时候是通过Junit进行测试,而现在的测试我们找Spring,Spring再找Junit)
3️⃣:使用@ContextConfiguration指定配置文件或配置类
4️⃣:使用@Autowired注入需要测试的对象
5️⃣:创建测试方法进行测试

3.4 Spring集成Junit代码实现

首先导入spring集成Junit的坐标

<!--单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <!--spring集成测试-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.0.5.RELEASE</version>
    </dependency>

接着创建一个测试类,然后使用@Runwith注解替换原来的运行期,那之前我们是直接右键执行找Junit,而现在我们要找Spring为我们提供的内核,它在帮我们测值再找Junit,但它在找Junit之前可以帮我们完成很多工作比如说Spring容器的一个创建,配置文件的加载等等,都能帮我们完成,所以这里使用runwith注解,然后用@ContextConfiguration指定要加载的配置文件,接着使用@Autowired注解直接注入要测试的东西在这里插入图片描述

下面再写个测试方法👇:
在这里插入图片描述
运行结果成功,说明搭建的环境没问题👇:
在这里插入图片描述

那么如果你还想测DataSource对象,可以很快搞定👇:
在这里插入图片描述
运行结果👇:
在这里插入图片描述

所以就是只要我们把测试环境搭好之后,我后期测谁,我们的工作就是在里边注入谁就可以了,这就是Spring集成Junit。

还有一个问题就是刚刚我们加载的是配置文件,那么我们如果用全注解的方式怎么写呢,如下👇:,里边的classes告诉它你要的不是配置文件,而是配置类,所以给一个字节码类型的值
在这里插入图片描述
运行结果👇:
在这里插入图片描述

3.5 知识要点

Spring集成Junit步骤
1️⃣:导入spring集成Junit的坐标
2️⃣:使用@Runwith注解替换原来的运行期
3️⃣:使用@ContextConfiguration指定配置文件或配置类
4️⃣:使用@Autowired注入需要测试的对象
5️⃣:创建测试方法进行测试


下一篇👉Spring----SpringAOP简介

本篇博客到这就完啦,非常感谢您的阅读🙏,那么下一篇将会学习关于SpringAOP思想的相关知识,如果对您有帮助,可以帮忙点个赞或者来波关注鼓励一下喔😬

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值