我理解的Spring(三)注解

本文介绍了Spring框架中的注解使用方法,包括组件扫描、依赖注入等关键注解的应用场景及配置方式。

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

一、前言

我们在前面使用Spring的时候可以看到,虽然确实耦合度低了,但是代码量去上去了,会产生大量的配置代码。
其实Spring也考虑到了这一点,因此有了注解来简化我们的配置。
接下来,我们就来看一看把。

二、组件扫描

使用组件扫描,需要先配置注解扫描,它的配置非常简单,就一句话。代码如下。
base-package指定要扫描的包名,Spring容器会去扫描该包及其子包中含有特定注解的类,将它们纳入容器管理。

<context:component-scan base-package="anno" />

三、组件扫描的注解

组件扫描并不是将指定包下的所有类都会纳入容器管理,而是会将含有特定注解的类纳入,那这些特定注解是什么呢?如下:

  • @Componet 通用注解
  • @Named 通用注解
  • @Repository 持久层注解
  • @Service 业务层注解
  • @Controller 控制层注解

这些注解中会发现@Component和@Named都是通用注解,都是可以使用的,功能都差不多,据说里面有一些两大公司的恩恩怨怨,就不细说了,@Named是sun公司的,如需使用该注解,需要单独导包,因此,通常使用@Component就行了。
其他三个注解都非常常用,需牢记。

在我们的上一章中,配置bean时,可以看到,我们会给每一个bean配置一个id,该id唯一存在,一般采用简写的方式,方便调用。那么我们的注解是否可以实现该功能呢?这是必须的。如下。

@Component(“stu”)
public class Student{}

可以看出,我们给Student添加了注解,并且括号中写了一个stu,这就是配置文件中的id了。

四、其他注解

接下来简单说一下其他几个注解。都是上一章配置时说明了的,不清楚的小伙伴可以去看一下我上一篇文章----我理解的Spring(二)

1. 作用域 @Scope

作用域有两个属性,分别为singleton和prototype。用来规定该类是否为单例。写在类名之上就可以
示例:

@Scope(“prototype”)

2. 初始化方法 @PostConstruct

该注解写在类的初始化方法上

3. 销毁方法 @PreDestroy

该注解写在类的销毁方法上

4. 延迟加载 @Lazy

该注解写在类名之上
当单例的类需要延迟加载时,可以如下。

@Lazytrue

五、依赖注入相关的注解

1. @Autowired 和 @Qualifier

这一组注解支持set方式注入和构造器方式注入。
使用set方式注入时,将@Autowired写在set方法上,此时采用的是自动装备中byType的方式,可能会出现错误,在参数前写上@Qualifier则会采用byName的方式,避免错误的产生。
使用构造器方式注入时,将这一组注解写在构造器上。使用规则和set方式类似。
这一组注解也可以直接写在属性上,此时就可以省略set方法。构造器方式就不再记录了。
代码如下:
AA.java

package anno;

import org.springframework.stereotype.Component;

@Component("aa")
public class AA {
	public AA(){
		System.out.println("AA()");
	}
}

BB.java

package anno;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("bb")
public class BB {
	
	private AA aa;
	
	@Autowired
	public void setAa(@Qualifier("aa") AA aa){
		this.aa = aa;
		System.out.println("setAa");
		System.out.println(aa);
	}
	
	public BB(){
		System.out.println("BB()");
	}
}

结果:

AA()
BB()
setAa
anno.AA@3d36e4cd

BB.java也可以是这样的

package anno;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component("bb")
public class BB {
	
	@Autowired
	@Qualifier("aa")
	private AA aa;
	
	public BB(){
		System.out.println("BB()");
	}
	
	public void say(){
		System.out.println(aa);
	}
}

@Resource

只支持set方式注入。
将注解写在set方法上,使用name属性指定注入bean的id,如果不指定则按byType方式注入,可能会出错。
该注解也可以写在属性上。
代码如下:

package anno;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

@Component("bb")
public class BB {
	
	@Resource(name="aa")
	private AA aa;
	
	public void say(){
		System.out.println(aa);
	}
}

注意:@Resource注解是属于J2EE的,是在javax包中的,因此需要额外导包,此处记录一下依赖,可以直接使用。
无法使用@Resource的就在pom.xml导入依赖即可。

<dependency>
	<groupId>javax.annotation</groupId>
	<artifactId>javax.annotation-api</artifactId>
	<version>1.3.2</version>
</dependency>

@Value

可以使用该注解注入基本类型的值。也可以使用该注解使用Spring表达式。
使用时将@Value添加到对应的set方法上或者属性上。

	@Value("张三")
	private String name;
	@Value("#{db.username}")
	private String username;

结束语

Spring是比较大的一个框架,里面的内容也还是很多的,经过三章的记录,大致将Spring容器相关的内容介绍的差不多了。下一章将记录一下SpringMVC相关知识点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值