【spring】配置类和整合Junit

1.配置类

在spring中,虽然可以用@Component把我们想要放入的bean所属的类放入ioc容器中,但是这个类局限于自己自定义的类,但是如果时其他已经被封装好的实现的类,我们就不能这么干了,就只能老老实实用xml文件来。其实还是有其他方法的,它就是java的配置类。

那至于什么是配置类呢,它的作用其实和xml文件的作用是差不多的,都是用来管理bean的。

首先来介绍@Configuration

它的作用就是用来指定当前的类是一个配置类。

其实讲到这就够了,至于怎么获取bean后面再来讲。

接着我们来讲一下@ComponentScan

它就是通过注解的方式指定spring在创建容器时要扫描的包(带有@Conponent,@Service),使用它就等同于在xml文件中配置了.它一般和@Configuration配合使用。

<context:component-scan base-package="包路径"></context:component-scan>

该注解有4个属性,分别是basePackages,basePackageClasses,includeFilters,excludeFilters,下面来分别讲解吧。

**basePackages:**用与指定要扫描的包的路径,可以同时指定多个包,例如@ComponentScan(basePackages={" 包1","包2"})

**basePackageClasses:**这个就更加准确,用来指定具体要扫描的类,它也可以同时指定多个类,例如:@ComponentScan(basePackageClasses={"类a.class,类b.class"})

**includeFilters:**指定要筛选的类,它一般配合basePackages来使用,通常先是basePackages来指定要扫描的包,然后includeFilters来从这些包中指定要筛选的类型。例如@ComponentScan(basePackages={"包1,包2"}

includeFilters=@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE,classes="类a")

这里还要补充一点就是关于这里的type,常用的分两种,FilterType.ASSIGNABLE_TYPE和FilterType.ANNOTATION,第一个就是表明该过滤器会筛选指定的类及其子类,第二个就不会连带着筛选指定的类的子类,而是你标明是什么类就筛选什么类。

**excludeFilters:**它与includeFilters就相反了,它是用来指定要排除的类,当然它也需要与basePackages配合使用,流程也是一样的,先是basePackages来指定要扫描的包,然后excludeFilters来排除相应的类其他就可以注册为bean。

同样需要补充的是,它也有不同的类型,常用的分别是 FilterType.ASSIGNABLE_TYPE和 FilterType.ANNOTATION,也是一样的一个就是排除类及其子类,另一个就是排除类但不排除它的子类。

例如 @ComponentScan(

basePackages = "包",

excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = 类)

)

然后呢来讲一下@Bean

他是用于把当前的方法的返回值作为bean对象作为返回值放入IOC容器中

它有一个属性name,用于指定当前bean的id,如果不写,id默认为方法名。

这里还有一点要提醒,它默认还是单例bean,如果我们想要创建多例bean,就再加一个注解,就是@Scope(value="prototype"),这样就行了

然后就是@Import了

它用于引入其他的配置类,用于实现配置的模块化(通俗点讲就是解决了整个项目所有的bean都交由一个配置类,这样显然不符合java中分层的思想,所以可以将这些bean拆分为其他模块,最后在通过引入的方式合并)

例如@Configuration

@Import({类a.class, 类b.class})

最后呢就是@PropertySource

它是用于指定一个或多个属性配置文件的位置,以便在应用程序中加载和使用这些配置文件中的属性值。它可以将外部的属性文件加载到 Spring 的环境中,从而在应用程序中方便地访问这些属性值。

它可以通过value属性指定属性文件的位置,可以使用类路径(classpath:)或文件系统路径(file:)

例如

复制代码
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
    // 配置类内容
}

它支持同时加载多个文件,文件间用逗号隔开即可

下面用一个properties文件为例

文件内容如下

复制代码
jdbc.username=root
jdbc.password=Admin123!
jdbc.url=jdbc:mysql://192.168.10.137:3306/user
jdbc.driverClass=com.mysql.jdbc.Driver

代码

复制代码
​
​
​
@PropertySource("classpath:jdbcConfig.properties")
public class JdbcConfig {
@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(name = "dataSource")
public DataSource dataSource(){
ComboPooledDataSource dataSource = new ComboPooledDataSource();
try {
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
} catch (PropertyVetoException e) {
throw new RuntimeException();
}
}
}

​

​

​

接下来就讲一下啊这个配置类到底怎么用

直接上代码

复制代码
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 定义一个服务类
class MyService {
    public void doSomething() {
        System.out.println("Doing something...");
    }
}

// 配置类
@Configuration
class AppConfig {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建 Spring 应用上下文
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // 从上下文中获取 Bean
        MyService service = context.getBean(MyService.class);

        // 调用 Bean 的方法
        service.doSomething();

        // 关闭上下文
        context.close();
    }
}

其实跟之前xml的方式差不多,只不过这个类吧变成了AnnotationConfigApplicationContext,然后把相应的类放进去。

2.整合Junit

Junit就是用来测试片段代码的,下面直接上代码

复制代码
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class TestAccount {

    @Autowired
    AccountService accountService;

    @Test
    public void test() {
        // 3. 执行方法
        List<Account> accounts = accountService.findAllAccount();
        for (Account account : accounts) {
            System.out.println(account);
        }
    }
}

**@RunWith(SpringJUnit4ClassRunner.class):**让 JUnit 使用 Spring 测试运行器,激活 Spring 容器的依赖注入等功能。

**@ContextConfiguration(classes = SpringConfiguration.class):**指定 Spring 容器的配置来源(配置类或 XML 文件),告诉测试环境如何加载 Bean。

相关推荐
YuTaoShao1 分钟前
【LeetCode 热题 100】240. 搜索二维矩阵 II——排除法
java·算法·leetcode
考虑考虑1 小时前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干1 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying1 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·2 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
春生野草2 小时前
关于SpringMVC的整理
spring
martinzh3 小时前
Spring AI 项目介绍
后端
Bug退退退1233 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠3 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
前端付豪3 小时前
20、用 Python + API 打造终端天气预报工具(支持城市查询、天气图标、美化输出🧊
后端·python