一、前言
我们在前面使用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
该注解写在类名之上
当单例的类需要延迟加载时,可以如下。
@Lazy(true)
五、依赖注入相关的注解
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相关知识点。