在现在的框架开发中,大多数用的都是注解开发技术。注解配置要实现的功能和XML实现的功能都是一样的,只是配置的形式不同。
注解的标签可以分为3类:创建对象、注入数据、其他配置。XML配置文件亦是如此。
看一个简单的例子:例子中的3个框就是分成了3类,这三类标签最后都可以用注解来代替。
现在开始详细介绍spring中的标签。
一、Spring中的标签汇总
用于创建对象: @Component、@Controller、@Service、@Repository
用于注入数据: @Value、@Resource、@Autowired、@Qualifier和@Primary
其他设置: @Scope、@DependsOn、@Lazy、@PostConstruct和@PreDestroy
二、标签的详细用法讲解
1. 用于创建对象的标签
(1) @Component: 用于把当前对象存入到Spring容器中。标签中含有属性value,用于指定bean的id,当只有一个属性时可以省略,bean名称默认是该类的首字母小写,其他不变。平时我们没有其他要求的时候,都是直接用省略写法的。
例子: 例子中有详细的注解说明
@Component // 直接省略value属性,默认名称为 person
@Component("person") // 省略value的写法
@Component(value="person") // 全写
public class Person {
private String name;
private Pet pet;
}
用于创建对象的标注除了@Component还有@Controller、@Service、@Repository,他们的作用和属性与@Component完全一样,是Spring框架为我们提供给三岑该架构标注的,目的是使我们的三层对象更加清晰。用法也是一摸一样,就只是改了一下名字,可以参考上面的@Component
(2) @Controller: 标注一个控制层的组件类,用在表现层。
(3) @Service: 标注一个业务逻辑组件类,用在业务层。
(4) @Repository: 标注一个DAO组件类,用在持久层。
2. 用于注入数据
(1)@Value: 注入基本数据类型和字符串。@Value的使用方式就是在里面的value属性添加需要注入的基本数据类型和字符串,如@Value(value=“zhangsan”),可简写为@Value(“zhangsan”)。
用XML的时候,我们是这样注入基本数据类型的
<!-- 依赖注入 -->
<bean id="person" class="com.test.pojo.Person">
<property name="name" value="Zhangsan"/>
<property name="age" ref="18"/>
</bean>
用注解的方式的话是这样
@Component
public class Person {
@Value("zhangsan")
private String name;
@Value("18")
private int age;
}
(2) @Autowired: 这是注入引用类型的,自动按类型注入。set方法可以省略,因为实质是在容器里匹配值。相当于xml中的bean的Autowire属性的byType。只要IoC容器中有唯一的Bean对象类型和要注入的变量类型匹配,即可注入成功。如果IoC容器中没有任何Bean对象类型和要注入的变量类型匹配则报错。如果IoC容器中有多个bean对象类型和要注入的变量类型匹配,首先按照类型匹配范围,然后以变量名称继续查找,如果找到则注入,否则报错。
参考例子讲解:首先会到容器中寻找是否存在Person 类型的bean对象,如果找到,且是唯一的,即可直接注入成功。如果找到不到则报错。如果找到很多个Person类型的bean对象,则会按zhangsan 的变量名继续查找,找到则注入,找不到就报错
@Autowired
private Person zhangsan;
(3)@Qualifier: 这个标注是要配合上面的@Autowired使用的,在按照类型中的注入基础上再按照注解名称参数匹配。
参考例子:当@Autowired按类型、变量名称都无法匹配到bean对象时,用@Qualifier可以指定按zhangsan这个名称来匹配bean对象。
@Autowired
@Qualifier("zhangsan")
private Person person;
(4)@Primary: 当前面的@Autowired没有匹配到默认值时,也没有找到@Qualifier时候,会到相应的类上查找是否有@Primary注解,再找不到就报错。@Primary没有找到其他规则后,强制选择注入该类的对象。
需要注意的是,@Primay是写在对应的实体类中的。
@Component
@Primary
public class Person {
private String name;
private int age;
}
(5)@Resource: 自动按照名称注入,相当于xml中的bean的Autowire=byName。可以认为它等价于@Autowired+@Qualifier,但是后者有个优先是按照类型匹配的原则,找不到后再按@Qualifier指定的名称去匹配。需要注意的是,其属性为name,不是value。
@Resource(name="zhangsan")
private Person person
一般使用的时候,用@Autowired就足够了,但是有时候会遇到高级用法,比如接口实现多态,而需要注入的类型是父类的接口,这时候就需要用到按名称或者按优先权等其他的注入方式。
以上讲的例子都是用设值注入的,也就是xml中的set方法注入,只是在注解方式中,不用写setter方法了。改造成构造注入的写法也非常简单,把相应的注解写在构造方法中的对应参数上即可。
public Person(@Value("张三") String name,@Value("18") int age,@Autowired Pet pet){
this.name = name;
this.age = age;
this.pet = pet;
}
3. 其他设置
(1)@Scope: 用于指定Bean的作用范围,属性value,指定范围的取值,常用取值singleton和prototype,request,session等,默认值为singleton。需要写在bean的类中。
@Component
@Scope("prototype")
public class Person{
····
}
(2)@DependsOn: 配置依赖关系。在xml中,bean的生成顺序默认是由上到下的顺序生成的,但是可以通过depends-on来修改。@DependsOn的效果相同。
@Component
@DependsOn("two") // 依赖于two这个Bean对象,先得创建two
public class one{
······
}
(3)@Lazy: 延迟初始化设置。在xml中有lazy-init="true"的 配置,指定当spring容器初始化时,不会初始化该bean对象,直到它真正被使用时才初始化。@Lazy标志效果相同。
@Component
@Lazy(true)
public class LazyClass {
······
}
(4)@PostConstruct与@PreDestroy: @PostConstruct用于指定初始化方法,@PreDestroy指定销毁方法。
@Component
public class Person {
@PostConstruct
public void init() {
System.out.println("初始化方法init");
}
@PreDestroy
public void close() {
System.out.println("销毁前执行方法close");
}
public void run() {
System.out.println("程序正在运行");
}
总结
spring的注解开发方式在当前使用非常常见,尤其是在springboot中,spring的注解开发需要我们熟悉掌握。但是又不能完全抛弃xml,因为在比较久的一些项目中,使用ssm开发时,全局配置使用的是xml,而业务中使用注解的方式。不过现在的Spring版本提供了Spring的配置类写法,有兴趣的同学可以去学习一下,spring的配置类。