b spring之javacode-based容器配置介绍

–> go to 总目录

12 基于java的容器配置

本章介绍如何用注解配置java容器

  • Basic Concepts: @Bean and @Configuration
  • Instantiating the Spring Container by Using AnnotationConfigApplicationContext
  • Using the @Bean Annotation
  • Using the @Configuration annotation
  • Composing Java-based Configurations
  • Bean Definition Profiles
  • PropertySource Abstraction
  • Using @PropertySource
  • Placeholder Resolution in Statements

12.1 Basic Concepts: @Bean and @Configuration

java注解的核心是 @Configuration和@Bean注解

@Bean注解被用来标准在方法实例上,和初始化一个被Spring IOC容器管理的新对象。
@Bean注解和xml中的作用一直。
使用
你可以把@Bean注解用在@Component里面,但是最常用的是用在
@Configuration里面
在这里插入图片描述
等同于
在这里插入图片描述

如果在未使用@Configuration注释的类中声明@Bean方法,则将它们称为以“精简”模式进行处理。在@Component或什至在简单的旧类中声明的Bean方法被认为是“精简版”,其中包含类具有不同的主要用途,而@Bean方法在那里具有一定的优势。例如,服务组件可以通过每个适用组件类上的其他@Bean方法将管理视图公开给容器。在这种情况下,@Bean方法是一种通用的工厂方法机制。

与完整的@Configuration不同,lite @Bean方法无法声明Bean之间的依赖关系。取而代之的是,它们在其包含组件的内部状态上进行操作,并且还可以根据可能声明的自变量进行操作。因此,此类@Bean方法不应调用其他@Bean方法。每个此类方法实际上只是针对特定bean引用的工厂方法,而没有任何特殊的运行时语义。这里的积极副作用是,不必在运行时应用CGLIB子类,因此在类设计方面没有任何限制(即,包含类可以是最终类,依此类推)。

在常见情况下,@Bean方法将在@Configuration类中声明,以确保始终使用“完全”模式,因此跨方法引用将重定向到容器的生命周期管理。这样可以防止通过常规Java调用意外地调用同一@Bean方法,这有助于减少在“精简”模式下运行时难以跟踪的细微错误。

12.2 使用AnnotationConfigApplicationContext 初始化容器

以下各节介绍了Spring 3.0中引入的Spring的AnnotationConfigApplicationContext。这种通用的ApplicationContext实现不仅能够接受@Configuration类作为输入,而且还可以接受普通的@Component类和带有JSR-330元数据注释的类。

当提供@Configuration类作为输入时,@Configuration类本身将注册为Bean定义,并且该类中所有已声明的@Bean方法也将注册为Bean定义。

提供@Component和JSR-330类时,它们将注册为bean定义,并且假定在必要时在这些类中使用了诸如@Autowired或@Inject之类的DI元数据。

简单的构建

与实例化ClassPathXmlApplicationContext时将Spring XML文件用作输入的方式几乎相同,实例化AnnotationConfigApplicationContext时可以将@Configuration类用作输入。如下面的示例所示,这允许Spring容器的使用完全不依赖XML:
在这里插入图片描述
如前所述,AnnotationConfigApplicationContext不限于仅与@Configuration类一起使用。可以将任何@Component或JSR-330带注释的类作为输入提供给构造函数,如以下示例所示:
在这里插入图片描述

使用register(Class<?>…)注册bean

您可以使用无参数构造函数实例化AnnotationConfigApplicationContext,然后使用register()方法对其进行配置。以编程方式构建AnnotationConfigApplicationContext时,此方法特别有用。以下示例显示了如何执行此操作:
在这里插入图片描述

使用scan扫描

注解的扫描
在这里插入图片描述
代码的扫描
在这里插入图片描述

使用AnnotationConfigWebApplicationContext支持Web应用

WebApplicationContext基于AnnotationConfigApplication的变体是AnnotationConfigWebApplicationContext。在配置Spring ContextLoaderListener Servlet侦听器,Spring MVC DispatcherServlet等时,可以使用此实现。以下web.xml代码段配置了一个典型的Spring MVC Web应用程序(请注意contextClass context-param和init-param的使用):

在这里插入图片描述

12.3 使用@Bean 注解

@Bean注解是一个方法级别的注解,等同于XML的<Bean>。支持init-method 和destory-method和autowiring

你可以把@Bean用在@Configuration和@Compoent注解上

声明一个Bean

在这里插入图片描述
等同于
在这里插入图片描述

也可以标注在接口interface上
TransferService就是一个接口
在这里插入图片描述

Bean的依赖

给方法带参数和@Bean组合可以解决依赖注入的问题
在这里插入图片描述

接受 LifeCycle Callbacks

任何使用@Bean注释定义的类都支持常规的生命周期回调,并且可以使用JSR-250中的@PostConstruct和@PreDestroy注释。有关更多详细信息,请参见JSR-250注释。

常规Spring生命周期回调也得到完全支持。如果bean实现了InitializingBean,DisposableBean或Lifecycle,则容器将调用它们各自的方法。

还完全支持标准的* Aware接口集(例如BeanFactoryAware,BeanNameAware,MessageSourceAware,ApplicationContextAware等)。

@Bean注释支持指定任意的初始化和销毁回调方法,非常类似于bean元素上Spring XML的init-method和destroy-method属性,如以下示例所示:

在这里插入图片描述

!有时需要关闭设定的Callbacks函数,指定为空就可以
在这里插入图片描述
这样就相当于关闭了上层设定的回调函数

指定beanScope

默认是singleton
在这里插入图片描述

pring提供了一种通过作用域代理处理作用scope 依赖性的便捷方法。使用XML配置时创建此类代理的最简单方法是<aop:scoped-proxy />元素。使用@Scope注释在Java中配置bean,可以通过proxyMode属性提供等效的支持。默认值为无代理(ScopedProxyMode.NO),但是您可以指定ScopedProxyMode.TARGET_CLASS或ScopedProxyMode.INTERFACES。
在这里插入图片描述

自定义Bean命名

在这里插入图片描述

Bean的别名

在这里插入图片描述

Bean的描述

在这里插入图片描述

12.4 使用@Configuration 注解

@Configuration 类级别的注解,@Configuration中的@Bean可以作为其他内部依赖的注入。注意@Component中的@Bean不可以在@Component之外被注入

注入内部依赖

注解这个类中并不是调用了beanTwo方法产生了一个实例,而是注入beanTwo的实例
在这里插入图片描述

方法注入

抽象类命令行模式
在这里插入图片描述
抽象方法的注入,这里并不是调用asycCommond方法,而是调用@Bean产生的实例,将其注入

内部机制

在这里插入图片描述
clientDao()在clientService1()中被调用一次,并在clientService2()中被调用一次。由于此方法创建了ClientDaoImpl的新实例并返回它,因此通常希望有两个实例(每个服务一个)。那肯定是有问题的:在Spring中,实例化的bean默认情况下具有单例作用域。这就是神奇的地方:所有@Configuration类在启动时都使用CGLIB进行了子类化。在子类中,子方法在调用父方法并创建新实例之前,首先检查容器中是否有任何缓存(作用域)的bean。

12.5 复合java-based配置信息

使用 @Import 来导入

为了降低单个配置问价的复杂程度
在这里插入图片描述
验证
都能获取到
在这里插入图片描述
在imported的@Bean上注入依赖
前面的示例有效,但过于简单。在大多数实际情况下,Bean在配置类之间相互依赖。使用XML时,这不是问题,因为不涉及编译器,并且您可以声明ref =“ someBean”并信任Spring在容器初始化期间进行处理。使用@Configuration类时,Java编译器会在配置模型上施加约束,因为对其他bean的引用必须是有效的Java语法。

幸运的是,解决这个问题很简单。正如我们已经讨论过的,@ Bean方法可以具有任意数量的描述Bean依赖关系的参数。考虑以下具有多个@Configuration类的更真实的场景,每个类均取决于其他类中声明的bean
在这里插入图片描述

还有另一种方法可以达到相同的结果。请记住,@Configuration类最终仅是容器中的另一个bean:这意味着它们可以利用@Autowired和@Value注入以及与任何其他bean相同的其他功能。

在这里插入图片描述

较为清晰的使用方式

全验证的易浏览的配置方式

在前面的场景中,使用@Autowired可以很好地工作并提供所需的模块化,但是确切地确定在何处声明自动装配的Bean定义仍然有些模棱两可。例如,当开发人员查看ServiceConfig时,您如何确切知道@Autowired AccountRepository bean的声明位置?它在代码中不是明确的,这可能很好。请记住,Spring Tool Suite提供了可以渲染图形的工具,该图形显示了所有接线的方式,而这可能正是您所需要的。另外,您的Java IDE可以轻松找到AccountRepository类型的所有声明和使用,并快速向您显示返回该类型的@Bean方法的位置。

如果这种歧义是不可接受的,并且您希望直接在IDE中从一个@Configuration类导航到另一个@Configuration类,请考虑自动装配配置类本身。以下示例显示了如何执行此操作:

、、在这里插入图片描述

包含@Configuration的类 和@Bean方法

尝尝需要条件性的完成@Configuration类和@Bean方法,基于有很多情形的系统。通用的做法是用@Profile注解来激活不同的Bean。
@Profile 注解是基于@Conditional注解完成。@Conditional注解指向
org.springframework.context.annotation.Condition类的实现,当bean注册是会用到。
Condition接口提供了matches(…)方法,返回true或false。如下是一个真实的应用于@Profile的Condition
在这里插入图片描述

1. 联合java和xml 配置,xml用java

最好从XML引导Spring容器,并以即席方式包含@Configuration类。例如,在使用Spring XML的大型现有代码库中,根据需要创建@Configuration类并从现有XML文件中将它们包含在内会变得更加容易。在本节的后面,我们将介绍在这种“以XML为中心”的情况下使用@Configuration类的选项。
宣布@Configuration作为xml 的元素

请记住,@Configuration类最终是容器中的bean定义。在本系列示例中,我们创建一个名为AppConfig的@Configuration类,并将其作为定义包含在system-test-config.xml中。因为<context:annotation-config />已打开,所以容器可以识别@Configuration批注并正确处理AppConfig中声明的@Bean方法
在这里插入图片描述
被包含在,也使用了datasource
在这里插入图片描述
properties文件
在这里插入图片描述
验证
在这里插入图片描述

使用 <context:component-scan/> 去搜索 @Configuration 类
由于@Configuration使用@Component进行元注释,因此@Configuration注释的类自动成为组件扫描的候选对象。使用与先前示例中描述的场景相同的场景,我们可以重新定义system-test-config.xml以利用组件扫描的优势。请注意,在这种情况下,我们无需显式声明<context:annotation-config />,因为<context:component-scan />可启用相同的功能。
在这里插入图片描述

2. 联合java和xml 配置,java用xml

使用ImportResource
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值