Spring中基于注解的配置详解

在现在的框架开发中,大多数用的都是注解开发技术。注解配置要实现的功能和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的配置类。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值