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-methoddestory-method 的作用是一样的

  • @PreDestory
  • 作用:用于指定销毁的方法(多例对象 spring 销毁方法是不负责的)
  • @PostConstruct
  • 作用:用于指定初始化方法

总结

  • 用于创建对象的
  • @Component
  • @Controller
  • @Service
  • @Repository
  • 用于注入数据的
  • @Autowired
  • @Qualifier
  • @Resource
  • @Value
  • 用于改变作用范围的
  • @Scope
  • 生命周期相关
  • @PreDestory
  • @PostConstruct