Spring中注解使用介绍(注入数据注解&config注解&测试类注解)

文章目录

  • 注解使用
    • 1.创建对象存入spring容器
      • @Component
      • @Controller
      • @Service
      • @Repository
    • 2.注入数据
      • @Autowired
      • @Qualifier
      • @Resource
      • @Value
      • @Scope
    • 3.config类(替代xml文件)
      • @configuration
      • @ComponentScan
      • @Bean
      • @MapperScan("包地址")
      • @Import
      • @PropertySource
    • 4.测试类中的注解
      • @RunWith
      • @ContextConfiguration

注解使用

1.创建对象存入spring容器

@Component

属性value 用于指定bean的id

@Controller

一般用在表现层

@Service

一般用在业务层

@Repository

一般用在持久层

后三个注解与Component相同,用在不同的层,使三层的结构更加清晰。
修改service.xml文件进行配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>
    <!--  扫描包中的注解  -->
    <context:component-scan base-package="demo"></context:component-scan>
</beans>

2.注入数据

@Autowired

类似于xml中写入标签,注入依赖,通过@Autowired注解自动进行配置,常加在方法前和类前。
注入过程:

@Service("accountService")
public class AccountServiceImpl implements IAccountService {
    @Autowired
    private AccountImpl account;

    @Override
    public void show() {
        account.selectById();
        System.out.println("表现层执行show操作");
    }
}
//获取 核心容器对象
    ApplicationContext ac = new ClassPathXmlApplicationContext("service.xml");
    //根据id获取bean对象
    IAccountService as = (IAccountService)ac.getBean("accountService");
    as.show();
  1. 通过类型自动进入IOC容器进行查找,IOC容器是map结构,直接跳过key值查询,查询value类型,如果匹配则直接创建。
  2. 如果容器中有多个使用相同接口的实现类,通过自定义变量名称,查询IOC中key位置的相同类型,所以会有推荐命名,保证方便查找

@Qualifier

如果上述过程都不同,则使用@Qualifier注解,在按照中注入的基础上按照名称注入。注意⚠️:在给类成员使用时不能单独使用,再给方法参数注入时可以单独使用。Spring中注解使用介绍(注入数据注解&config注解&测试类注解)_第1张图片
使用在参数名前,如果有多个datasource类型资源,通过name指定使用其中一个。
Spring中注解使用介绍(注入数据注解&config注解&测试类注解)_第2张图片

@Resource

直接使用id,对对象进行注入。

  • 三种注解只能注入bean类型数据,基本类型和String无法使用
  • 集合类型的注入只能使用xml来实现

@Value

  • 用于注入接本类型和String类型
  • 可以使用spring中SpEL表达式${表达式}

@Scope

用于修改对象的范围,单例或者多列,默认单例,prototype多例
Spring中注解使用介绍(注入数据注解&config注解&测试类注解)_第3张图片


3.config类(替代xml文件)

使用config配置文件进行配置时,使用的容器类改为AnnotationConfigApplicationContext(class)传入配置文件的类。

@configuration

用来表明这是一个配置文件。

  • 作为AnnotationConfigApplicationContext(class)的对象创建参数时,该注解可以不写。

@ComponentScan

用来对包进行扫描,其中basePackages 和 value参数相同,都是输入被扫描的包。
Spring中注解使用介绍(注入数据注解&config注解&测试类注解)_第4张图片

@Bean

将当前方法作为返回值,作为bean对象存入IOC容器中。
属性:

  • name:用于指定bean的id,默认是方法名称
  • 当使用注解配置方法时,如果方法有参数,spring框架回去容器中查找有没有可用的bean对象,自动按照类型匹配。

@MapperScan(“包地址”)

提供Mapper包名,扫描所有mapper文件

@Import

属性:

  • value:用于指定其他配置类的字节码

在当前config文件上添加其他config文件进行配置,有@Import注解的类就是父配置类,没有的就是子配置类。

@PropertySource

用于指定properties文件的位置

  • value:指定文件的名称和路径,关键字classpath

4.测试类中的注解

JUnit原理:

  1. 应用程序入口main方法
  2. junit单元测试,不用写main方法,junit集成了一个main方法,在执行前判断那些方法有@Test注解,并且执行
  3. 但是Junit不知道当前框架是否是Spring框架,所以不会读取Spring的注解

@RunWith

在使用@Test类进行功能测试前,使用@Before对需要使用的Spring容器对象进行创建。

AnnotationConfigApplicationContext ac;
    IEmployeeService employeeService;
    @Before
    public void init(){
        //获取容器对象
        ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        employeeService = ac.getBean("employeeService",IEmployeeService.class);
        IEmployeeService employeeService2 = ac.getBean("employeeService",IEmployeeService.class);
        System.out.println(employeeService2==employeeService);
    }

但是如果不写这些内容,或者通过@Autowired注解对容器对象进行获取是获取不到的。这是因为:JUnit单元测试这是单纯的单元测试,不会对其中的Spring注解进行运行,也就是说自动获取无效。例如:

@Autowired
private IAccountService as = null;

解决方式:

  1. 加入依赖
<!--    加入spring-test    -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.2.6.RELEASE</version>
</dependency>
  1. 测试方法上加@RunWith注解,替换成Spring提供的main方法

    属性:class
    注意⚠️:test方法需要放在src/test测试包下才能运行。

Spring中注解使用介绍(注入数据注解&config注解&测试类注解)_第5张图片

@ContextConfiguration

  1. 创建Spring 的IOC容器,使用@ContextConfiguration注解:
    属性:
    Locations:指定的xml文件的位置,加classpath关键字,表示在类路径下
    classes:指定注解类所在位置
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class TestService {

    @Autowired
    private IEmployeeService employeeService = null;

通过xml获取:

@contextConfiguration(locations = "classpath:service.xml")

通过这种方式直接获取IEmployeeService对象而不需要通过AnnotationConfigApplicationContext对象来获取

你可能感兴趣的:(Spring)