Spring 基于注解的配置

从 Spring 2.5 开始就可以使用注解来配置依赖注入。你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身。

在 XML 注入之前进行注解注入,因此后者的配置将通过两种方式的属性连线被前者重写。

注解连线在默认情况下在 Spring 容器中不打开。因此,在可以使用基于注解的连线之前,我们将需要在我们的 Spring 配置文件中启用它。

他的作用是式地向 Spring 容器注册

AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、

PersistenceAnnotationBeanPostProcessor 以及 RequiredAnnotationBeanPostProcessor 这 4 个BeanPostProcessor。

注册这4个 BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。

例如:

如果你想使用@Autowired注解,那么就必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。传统声明方式如下

<bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/> 

如果想使用@ Resource 、@ PostConstruct、@ PreDestroy等注解就必须声明CommonAnnotationBeanPostProcessor

如果想使用@PersistenceContext注解,就必须声明PersistenceAnnotationBeanPostProcessor的Bean。

如果想使用 @Required的注解,就必须声明RequiredAnnotationBeanPostProcessor的Bean。同样,传统的声明方式如下:

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/> 

一般来说,这些注解我们还是比较常用,尤其是Antowired的注解,在自动注入的时候更是经常使用,所以如果总是需要按照传统的方式一条一条配置显得有些繁琐和没有必要,于是spring给我们提供<context:annotation-config/>的简化配置方式,自动帮你完成声明。

   不过,我们使用注解一般都会配置扫描包路径选项 <context:component-scan base-package=”XX.XX”/> 

    该配置项其实也包含了自动注入上述processor的功能,因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了

如果不填加这些配置,基于注解的配置将不起作用或只有一点作用

几个重要注解:

1.@Required :注解应用于 bean 属性的 setter 方法。它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出异常。

如果不在配置文件中启用基于注解的配置,那么当你使用上述代码后,而配置文件中没有注入他,那么编译器只会有上面的提示,启动时不会报错。

2.@Autowired: 注解可以应用到 bean 属性的 setter 方法,非 setter 方法,构造函数和属性。

setter方法的@Autowired

当 Spring遇到一个在 setter 方法中使用的 @Autowired 注释,它执行 byType方式 自动连接,找不到会报错(如果两个相同类型的bean可以被注入,其中一个bean的名字和setter方法中形参一样,则不会报错 ,autowire="byType"方式会报错)。

属性中的@Autowired

当 Spring遇到一个在属性中的 @Autowired 注释,先通过属性名字查找相同id或name的bean,找不到后再通过属性类型找,找到一个就注入,找不到或找到多个就报错,和construction方式类似。

构造函数的@Autowired

当 Spring遇到一个在属性中的 @Autowired 注释,先通过属性名字查找相同id或name的bean,找不到后再通过属性类型找,找到一个就注入,找不到或找到多个就报错,和construction方式类似。

@Autowired的(required=false)选项

默认情况下,@Autowired 注释意味着依赖是必须的,它类似于 @Required 注释,然而,你可以使用 @Autowired 的 (required=false) 选项关闭默认行为,对构造函数的@Autowired无效。

3.@qualifier

当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱。

假如你是用了@qualifier("bean1"),而由两个bean1,bean2,其中bean2被设置为primary=“true”,那么bean1将被注入,说明@qualifier的优先级高于primary=“true”,如果bean1被设置为autowire-candidate="false",那么将会报错,找不到bean1注入。

4.JSP-250注释

@PostConstruct和@PreDestroy

为了定义一个 bean 的安装和卸载,我们使用 init-method 和/或 destroy-method 参数简单的声明一下 。init-method 属性指定了一个方法,该方法在 bean 的实例化阶段会立即被调用。同样地,destroy-method 指定了一个方法,该方法只在一个 bean 从容器中删除之前被调用。

你可以使用 @PostConstruct 注释作为初始化回调函数的一个替代,@PreDestroy 注释作为销毁回调函数的一个替代,继承InitializingBean,DisposableBean 也可实现初始化和销毁时的回调方法,其中优先级(调用的顺序)@PostConstruct和@PreDestroy  >  继承InitializingBean,DisposableBean >  init-method 和/或 destroy-method

@Resource注释

你可以在字段中或者 setter 方法中使用 @Resource 注释,不允许用于构造方法,它和在 Java EE 5 中的运作是一样的。@Resource 注释使用一个 ‘name’ 属性,该属性以一个 bean 名称的形式被注入。你可以说,它遵循 by-name 自动连接语义,

如果没有明确地指定一个 ‘name’,默认名称源于字段名或者 setter 方法中的形参。在字段的情况下,它使用的是字段名;在一个 setter 方法情况下(只允许使用一个参数),它使用的是形参。

先通过属性名字查找相同id或name的bean,找不到后再通过类型找,找到一个就注入,找不到或找到多个就报错,和construction方式类似

5.基于java的注解

@Configuration表示当前类可以作为spring Ioc容器定义bean的来源,@Bean表示注解方法将返回一个对象,该对象应该被注册为在 Spring 应用程序上下文中的 bean。

 

相当于:

在这里,带有 @Bean 注解的方法名称作为 bean 的 ID,它创建并返回实际的 bean。你的配置类可以声明多个 @Bean。一旦定义了配置类,你就可以使用 AnnotationConfigApplicationContext 来加载并把他们提供给 Spring 容器

①:

或者

②:

带参数的构造方法:

   

所以方式①和方式②都是一样的。

注入Bean的依赖:

当 @Beans 依赖对方时,表达这种依赖性非常简单,只要有一个 bean 方法调用另一个

@Import注解允许从另一个配置类中加载 @Bean 定义

 

 生命周期回调:

@Bean 注解支持指定任意的初始化和销毁的回调方法,就像在 bean 元素中 Spring 的 XML 的初始化方法和销毁方法的属性:

在基于java注解配置的bean中可以起作用的回调方法

你可以使用 @PostConstruct 注释作为初始化回调函数的一个替代,@PreDestroy 注释作为销毁回调函数的一个替代,继承InitializingBean,DisposableBean 也可实现初始化和销毁时的回调方法,其中优先级(调用的顺序)@PostConstruct和@PreDestroy  >  继承InitializingBean,DisposableBean > @Bean(initMethod 和 destroyMethod)

@Scope可以指定作用域

posted @ 2019-05-23 13:46  yuby  阅读(3294)  评论(0编辑  收藏  举报