基于注解的Spring框架学习(一)——Ioc

本文介绍了如何使用注解模式配置Spring框架,包括添加依赖、自定义模板和创建配置文件。接着详细讲解了常用的注解如@Component、@Scope、@Lazy等,并通过示例展示了它们在Bean管理、初始化和销毁过程中的应用。此外,还阐述了@Autowired和@Resource注解在自动装配中的作用,以及如何解决多Bean注入时的歧义问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习注解模式前,建议先阅读我的前一篇XML模式下的Spring博文,注解模式相较于XML模式来说,更加的简单、简洁。

1. 框架部署

1.1 添加依赖

添加 Spring 的依赖以及 lombok 的依赖。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.13.RELEASE</version>
</dependency>

1.2 自定义模板

自定义模板文件,文件名为 spring-ioc-annotation ,后缀为 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
       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:annotation-config/>

    <!-- 声明Spring工厂注解的扫描范围 -->
    <context:component-scan base-package="com.mr.beans"/>

</beans>

1.3 创建Spring配置文件

因为 Spring 容器初始化时,只会加载 applicationContext.xml 文件,那么我们在实体类中添加的注解就不会被 Spring 扫描,所以我们需要在 applicationContext.xml 声明Spring的扫描范围,以达到 Spring 初始化时扫描带有注解的实体类并完成初始化工作。
使用 spring-ioc-annotation 模板来创建 applicationContext.xml 文件。

2. 常用注解

2.1 @Component

  • 类注解,声明此类被Spring容器进行管理,相当于 bean 标签的作用
  • 也可以使用 value 属性用于指定当前 bean 的id ,@Component(value="stu") ,相当于bean标签的id属性; value 属性也可以省略,如果省略当前类的 id 默认为类名首字母改小写
  • 除了 @Component 之外 @Service@Controller@Repository 这三个注解也可以将类声明给 Spring 管理,他们主要是语义上的区别
    • @Controller 注解主要声明将控制器类配置给Spring管理,例如Servlet
    • @Service 注解主要声明业务处理类配置Spring管理,Service接口的实现类
    • @Repository 直接主要声明持久化类配置给Spring管理,DAO接口
    • @Component 除了控制器、servcie和DAO之外的类一律使用此注解声明
  1. Bean类
@Component(value = "stu")
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {
    private String stuNum;
    private String stuName;
    private String stuGender;
    private int stuAge;
    private Date enterenceTime; //入学日期
}
  1. 测试类
public class Test1 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student1 = (Student) context.getBean("stu");
        System.out.println(student1);
    }
}

运行后的输出如下:
在这里插入图片描述
可以发现,注释比一般形式更加方便。

2.2 @Scope

  • 类注解,用于声明当前类单例模式还是 非单例模式,相当于bean标签的scope属性;
  • @Scope("prototype") 表示声明当前类为非单例模式(默认单例模式)。

2.3 @Lazy

  • 类注解,用于声明一个单例模式的Bean是否为懒加载;
  • @Lazy(true) 表示声明为懒汉模式,默认为 false

2.4 @PostConstruct

方法注解,声明一个方法为当前类的初始化方法(在构造器之后执行),相当于bean标签的 init-method 属性。

2.5 @PreDestroy

方法注解,声明一个方法为当前类的销毁方法(在对象从容器中释放之前执行),相当于bean标签的 destory-method 属性。

2.6 @Autowired

  • 属性注解、方法注解(set方法),声明当前属性自动装配,默认byType
  • @Autowired(required = false) 通过 requried 属性设置当前自动装配是否为必须(默认必须——如果没有找到类型与属性类型匹配的bean则抛出异常)
  • @Autowired 默认使用 byType 来装配属性,如果匹配到类型的多个实例,再通过 byName 来确定Bean。

2.7 @Qualifier

@Qualifier 限定哪个bean应该被自动注入。当Spring无法判断出哪个bean应该被注入时,@Qualifier 注解有助于消除歧义bean的自动注入。示例如下:

若定义了两个 bean 标签的实例,如下,

<bean id="stu1" class="com.mr.bean.Student"></bean>
<bean id="stu2" class="com.mr.bean.Student"></bean>

引用实例时

public class clazz
{
    @Autowired
    private Student stu;
}

如果按照上面的程序运行的话,Spring会不知道注入那个实例,该程序会进行报错,而按照下面进行 @Qualifier 注解的话就不会进行报错。

public class clazz
{
   @Autowired
   @Qualifier("stu1")
   private Student stu;
}

2.8 @Resource

  • 属性注解,也用于声明属性自动装配
  • 默认装配方式为 byName,如果根据 byName 没有找到对应的bean,则继续根据 byType 寻找对应的bean,根据 byType 如果依然没有找到Bean或者找到不止一个类型匹配的bean,则抛出异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值