Spring 常用注解
spring 除了使用 XML 的各种标签属性配置 bean 外,还有一种方法就是使用注解,注解的操作会比 XML 的配置来得简单。
步骤
首先,由于不用在 XML 中配置 bean 标签,但是我们在 main 函数还是使用了 XML 读取。所以不是使用来的注解就不需要 XML 了。
现在我们的 XML 文件中,声明 context 名称空间和约束,这个是用来告知 spring 在创建容器时要扫描的包,扫描这些包下哪些类有注解,如下实例代码
applicationContext.xml
<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">
<!-- 告知 spring 在创建容器时要扫描的包,配置所需要的标签不是在 beans 的约束中,而是一个名称为 context 的名称空间和约束中 -->
<context:component-scan base-package="com.test.entitys" ></context:component-scan>
</beans>
其中,在 <context >
标签中,可以使用一些属性和标签指定哪些注解不会被扫描到。
use-default-filters=“true”
属性
- 表示所有的注解都会被扫描。反之,值为 false ,就是都不扫描
<context:exclude-filter>
标签
- 一般用来排除哪些注解不会被扫描
- 属性
- type : 表示排除的类型,一般使用值
type="annotation"
表示要排除注解。 - expression :表示要排除的是哪个表达式,在
type="annotation"
我们使用注解的全类名表示。 - 如果 expression 排除的注解是 org.springframework.stereotype.Component 注解,则所有的注解都会被排除,这是因为所有的注解都是其子注解(子注解和子类的意思差不多。下面的内容会解释)
<context:include-filter>
标签
- 和上面的标签相反,用来包含只扫描哪几个注解,配合
use-default-filters=“false”
属性使用 - 属性
- type : 表示排除的类型,一般使用值
type="annotation"
表示要排除注解。 - expression :表示要排除的是哪个表达式,在
type="annotation"
我们使用注解的全类名表示。 - 如果 expression 包含的注解是 org.springframework.stereotype.Component 注解,则所有的注解都会被包含,这是因为所有的注解都是其的子注解(子注解和子类的意思差不多。下面的内容会解释)
例子:假如我不需要扫描到 @Service 注解,可以在 applicationContext.xml 的 <context>
标签中这样写
<context:component-scan base-package="com.test.annotation" use-default-filters="true">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
其次,在类或者方法上、属性上等添加注解。常见的注解分为下面几种。
用于创建对象的
作用和 XML 配置文件中编写 <bean>
标签的功能是一样的
@Component
- 作用:基本注解。就是把类对象存入 spring 容器
- 属性:
- value:就是 bean 标签指定的 id。不写时,默认值为当前类目,且首字母小写。
- 示例代码
@Component
public class Admin {....}
@Controller
- 作用:一般用于表现层,是基本注解的子注解。
@Service
- 作用:一般用于业务层,是基本注解的子注解
@Repository
- 作用:一般用于持久层,是基本注解的子注解
以上三个注解的作用和属性都和 Component 一模一样,他们三个是 spring 框架提供的明确的三层架构使用的注解,使我们三层更清晰。
用于注入数据的
作用和 xml 配置文件中的 <bean>
标签中写一个 <property>
标签是一样的。
@Autowired
- 作用:自动按照类型注入,只要容器中有唯一一个 bean 对象类型和要注入的变量类型匹配,就可以注入成功,如果 IOC 容器没有任何 bean 或注入的类型或不一样,就会报错
- 如果有多个类型匹配
- 先匹配类型,然后根据变量名称去对应,如果变量名称和 bean 名称相同,就注入,不行就报错。
- 或者使用下面的 @Qualifier 注解,通过指定容器中 bean 的 id 来注入。
- 出现位置:可以成员变量、方法等等
- 细节
- 如果在使用注解的位置是在属性上,那么 set 、get 方法可以不需要。
- 我们可以改变 @Autowire d属性,设置为非必须装配,表示有则装配,没有则为 null 使用属性required=false 配置
@Qualifier
- 作用:在按照类已类型注入基础之上,在按照名称注入。它在给类成员注入时候不能单独使用(和 @Autowired 使用)。但是在给方法参数注入的时候可以单独使用
.....
@Autowired
@Qualifier("account1")
private Account account;
.....
@Autowired
public void setCar(@Qualifier("car1")Car car) {
this.car = car;
}
.......
- 属性:
- value 相当于 bean 的 id 属性。
@Resource
- 作用:直接按照 bean 的 id 注入
- 属性
- 变成 name ,用于指定 bean 的 id
注意:以上三个注解只能注解其他 bean 的类型,基本类型和 String 类型无法使用以上的三种方式,另外,集合类型只能通过 xml 方式实现。
@Value
- 用于注入基本类型和 String 类型的数据。
- 属性:
- value:用于指定数据的值,并且可以用 spring 中的 SpEl(spring 中的 EL 表达式)
- SPEL 写法 :
${表达式}
用于改变作用范围的
他们的作用就和 bean 标签中使用 scpoe 属性实现的功能是一样的
@Scope
- 作用用于指定 bean 标签的 作用范围
- 属性:
- value:指定范围的取值,例如 singleton,prototype
生命周期相关
他们的作用就和 bean
标签中使用 init-method
和 destory-method
的作用是一样的
@PreDestory
- 作用:用于指定销毁的方法(多例对象 spring 销毁方法是不负责的)
@PostConstruct
- 作用:用于指定初始化方法
总结
- 用于创建对象的
@Component
@Controller
@Service
@Repository
- 用于注入数据的
@Autowired
@Qualifier
@Resource
@Value
- 用于改变作用范围的
@Scope
- 生命周期相关
@PreDestory
@PostConstruct