全网疯传的Spring学习笔记【注解编程】,看完我也想写一个了!

举报
XiaoLin_Java 发表于 2022/01/31 17:34:53 2022/01/31
【摘要】 九、注解编程 9.1、注解编程概述    注解编程指的是在类或者方法上加入特定的注解,完成特定功能的开发。使用注解的好处:注解编程开发更方便,代码简洁,开发速度大大提升。注解编程是Spring开发的新趋势。 9.2、注解的作用简化xml文件中繁杂的配置。替换接口,实现调用双方的契约性。通过注解的方式,在功能调用者和功能提供者之间达成约定,进而进行功能的调用。注解形式是主流。 9.3、对象创...

九、注解编程

9.1、注解编程概述

    注解编程指的是在类或者方法上加入特定的注解,完成特定功能的开发。使用注解的好处:

  1. 注解编程开发更方便,代码简洁,开发速度大大提升。
  2. 注解编程是Spring开发的新趋势。

9.2、注解的作用

  1. 简化xml文件中繁杂的配置。

  2. 替换接口,实现调用双方的契约性。通过注解的方式,在功能调用者和功能提供者之间达成约定,进而进行功能的调用。注解形式是主流。

9.3、对象创建相关的注解

    这个阶段的注解仅仅只是为了简化XML配置而存在的,并不能完全替代XML。

9.3.1、@Component

9.3.1.1、代码示例

    既然我们开始使用注解开发,那么就需要告诉Spring,让Spring框架在你设置的包及其子包中扫描对应的注解,让他生效。

<context:component-scan base-package:"com.lin" />

Spring注解编程

package cn.lin;

import org.springframework.stereotype.Component;

@Component
@Data
public class User {
  private String id;
  private String username;
  private String password;
}

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

  <context:component-scan base-package="cn.lin"/>
</beans>
package cn.lin;

import static org.junit.Assert.*;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Description
 * @Author XiaoLin
 * @Date 2021/2/24 21:58
 */
public class UserTest {
  /**
  * 用于测试注解@Component
  */
  @Test
  public void testComponent(){
    ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
    User user = app.getBean("user", User.class);
    System.out.println(user);
  }
}

9.3.1.2、注意

  1. 使用@Component注解,他创建的对象的id值默认是类名的首字母小写。
  2. 我们可以通过@Component("自定义id值")方式来给创建的对象指定一个id值。
  3. Spring配置文件是可以覆盖注解配置的内容。id的值和class的值需要保持一致,如果不一致的话Spring会以为这个是一个新的对象,进而不去覆盖。

9.3.1.3、@Component的衍生注解

    @Component有三个衍生注解:

  1. @Repository
  2. @Service
  3. @Controller

    这些注解本质上就是@Component注解,用法(替代<bean>标签)和细节与@Component没有任何区别,本质上是一模一样的。我们查看源码@Repository可以证明这个结论(其他同理可证)。

image-20210225210144605

    Spring提供这些注解是为了更准确的表达一个类型的作用。

  1. @Repository:主要用于Dao接口。
  2. @Service:主要用于Service实现类。
  3. @Controller:主要用于控制器。

9.3.2、@Scope

9.3.2.1、概述

@Scope注解用于控制简单对象的创建次数。如果我们不添加@Scope注解的话,他有一个默认值是singleton

9.3.2.2、代码示例

// 单例模式,只会创建一次
@Scope("singleton")
public class User(){
    
}

9.3.3、@Lazy

9.3.3.1、概述

    @Lazy注解的作用是延迟创建单实例对象。

    如果没有进行配置的话,默认是在容器创建的时候,同步创建对象。

    如果添加了注解的话,在容器创建的时候就不会同步创建对象,而是在你需要使用的时候再创建对象。

9.4、声明周期方法相关的注解

9.4.1、@PostConstruct

    @PostConstruct注解用于方法上,表示这个方法是一个初始化方法。在引入这个注解时,我们需要先加入一组依赖。

<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
    <dependency>
      <groupId>javax.annotation</groupId>
      <artifactId>javax.annotation-api</artifactId>
      <version>1.3.2</version>
    </dependency>

@Component
@Data
public class User {

  // 表示这个是一个初始化方法
  @PostConstruct
  public void MyInit(){
    System.out.printf("User Init");
  }

9.4.2、@PreDestroy

    @PreDestroy注解用于方法上,表示这个方法是一个销毁方法。工厂关闭时会自动调用销毁方法。

  @PreDestroy
  public void MyDestory(){
    System.out.printf("User Destory");
  }

9.4.3、注意

    这连个注解都不是Spring提供的,是JSR(JavaEE规范)520提供的。所以需要导入依赖。

9.5、注入相关的注解

9.5.1、用户自定义类型:@Autowired

9.5.1.1、概述

    @Autowired是一种注解,可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作.

    @Autowired标注可以放在成员变量上,也可以放在成员变量的set方法上,也可以放在任意方法上表示,自动执行当前方法,如果方法有参数,会在IOC容器中自动寻找同类型参数为其传值。

9.5.1.2、代码示例

package cn.lin.dao;

import cn.lin.User;

/**
 * @Description
 * @Author XiaoLin
 * @Date 2021/2/26 9:17
 */

public interface UserMapper {
  public void login(User user);
}

package cn.lin.dao;

import cn.lin.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

/**
 * @Description
 * @Author XiaoLin
 * @Date 2021/2/26 9:18
 */

@Repository
public class UserMapperImpl implements UserMapper{

  @Override
  public void login(User user) {
    System.out.printf("登录了");
  }
}

package cn.lin.service;

import cn.lin.User;

/**
 * @Description
 * @Author XiaoLin
 * @Date 2021/2/26 9:19
 */

public interface UserService {
  void login(User user);
}

package cn.lin.service.impl;

/**
 * @Description
 * @Author XiaoLin
 * @Date 2021/2/26 9:19
 */
@Service
public class UserServiceImpl implements UserService {

  @Autowired
  private UserMapper userMapper;


  @Override
  public void login(User user) {
    userMapper.login(new User());
  }
}
 /**
  * 用于测试
  */
  @Test
  public void test(){
    ApplicationContext app = new ClassPathXmlApplicationContext("/applicationContext.xml");
    UserService userService = (UserService)app.getBean("userServiceImpl");
    userService.login(new User());
  }

9.5.1.3、注意

  1. @Autowired注解默认是基于类型进行注入,注入对象的类型必须与目标成员变量类型相同或者是其子类、实现类。

  2. 要是想基于名字进行注入的话,需要@Autowired结合另一个注解:@Qualifier("需要注入的类的id值")。基于名字的注入要求注入的对象的ud值必须与@Qualifier注解中设置的名字相同。

  3. @Autowired注解可以放置的位置:

    • 可以放置在对应成员变量的set方法上。Spring变量会调用set方法进行注入。
    • 直接放置在需要注入的成员变量之上。Spring会通过反射直接对成员变量进行注入。(推荐)
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。