返回顶部
首页 > 资讯 > 精选 >Spring Java-based容器配置的示例分析
  • 937
分享到

Spring Java-based容器配置的示例分析

springjava 2023-05-31 01:05:44 937人浏览 泡泡鱼
摘要

这篇文章主要介绍了spring Java-based容器配置的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。装Java-based的配置使用 @Import 注解跟在

这篇文章主要介绍了spring Java-based容器配置的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

装Java-based的配置

使用 @Import 注解

跟在Spring XML文件中使用<import>元素添加模块化的配置类似,@Import注解允许你加载其他配置类中的@Bean定义:

@Configurationpublic class ConfigA {@Bean  public A a() {return new A();}}@Configuration@Import(ConfigA.class)public class ConfigB {@Bean  public B b() {return new B();}}

组现在,当实例化上下文时,你只需要显式的指定ConfigB,而不需要既提供ConfigA.class,又提供ConfigB.class:

public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class);// now both beans A and B will be available...A a = ctx.getBean(A.class);B b = ctx.getBean(B.class);}

这种方式简化了容器的初始化,因为只需要处理一个类,而不是让开发者记住构造期间的大量@Configuration类。

导入@Bean的依赖注入

上面的示例可以工作,但太简单。在大多数实际的场景中,beans会依赖另一个跨配置类的bean。当使用XML时,这不是问题,因为不涉及到编译,其中一个bean只需要声明ref="someBean",剩下的交给Spring在容器初始化期间处理即可。当然,当使用@Configuration类时,Java编译器对配置模式产生一些限制,对其他beans的引用必须是合法的java语法。

幸运的是,解决该问题是很容易的。正如我们已经讨论的,@Bean可以有任意多个用来描述bean依赖的参数。让我们探讨一个更现实的场景,在这里将使用一些彼此依赖的@Configuration类:

@Configurationpublic class ServiceConfig {@Bean  public TransferService transferService(AccountRepository accountRepository) {return new TransferServiceImpl(accountRepository);}}@Configurationpublic class RepositoryConfig {@Bean  public AccountRepository accountRepository(DataSource dataSource) {return new JdbcAccountRepository(dataSource);}}@Configuration@Import({ServiceConfig.class, RepositoryConfig.class})public class SystemTestConfig {@Bean  public DataSource dataSource() {// return new DataSource}}public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(SystemTestConfig.class);// everything wires up across configuration classes...TransferService transferService = ctx.getBean(TransferService.class);transferService.transfer(100.00, "A123", "C456");}

这里有另外的方法可以达到相同的效果。记住,@Configuration根本上只是容器中的另一个bean-这意味着它们可以像其他bean那样充分利用@Autowired注入元数据。

注: 确保以这种方式注入的都是简单类型的。@Configuration类在容器初始化时被处理的相当早,用这种方式强制注入依赖可能导致无法预料地过早初始化问题。只要有可能就采用上面示例中基于参数的注入方式。

@Configurationpublic class ServiceConfig {@Autowired  private AccountRepository accountRepository;@Bean  public TransferService transferService() {return new TransferServiceImpl(accountRepository);}}@Configurationpublic class RepositoryConfig {@Autowired  private DataSource dataSource;@Bean  public AccountRepository accountRepository() {return new JdbcAccountRepository(dataSource);}}@Configuration@Import({ServiceConfig.class, RepositoryConfig.class})public class SystemTestConfig {@Bean  public DataSource dataSource() {// return new DataSource}}public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(SystemTestConfig.class);// everything wires up across configuration classes...TransferService transferService = ctx.getBean(TransferService.class);transferService.transfer(100.00, "A123", "C456");}

在上面的示例中,使用@Autowired工作的很好,并且提供了想要的模块化,但要确切地指明自动注入的bean定义在哪声明依旧有点模糊。例如,一个开发者正在查看ServiceConfig,那你怎么准确地知道@Autowired AccountRepository bean在哪声明的?在代码中并不明确,不过有时候这样就行。记着Spring Tool Suite可以提供渲染图的工具,这些图展示了Spring Bean之间是怎么连起来的-这可能是你需要的。同时,你的Java IDE可以轻松的找到所有声明和使用AccountRepository类型的bean,并为你快速展现返回该类型的@Bean方法位置。

如果你不能接受这种模糊性,并希望在你的IDE中可以从一个@Configuration类导航到另一个,那就考虑注入配置类本身:

@Configurationpublic class ServiceConfig {@Autowired  private RepositoryConfig repositoryConfig;@Bean  public TransferService transferService() {// navigate 'through' the config class to the @Bean method!return new TransferServiceImpl(repositoryConfig.accountRepository());}}

在上面的解决方案中,我们可以很明确地知道AccountRepository定义的地方。然而,ServiceConfig现在紧紧地跟RepositoryConfig耦合了。这就是权衡。紧耦合在某种程度上可以通过使用基于接口或抽象类的@Configuration类来减轻。考虑以下内容:

@Configurationpublic class ServiceConfig {@Autowired  private RepositoryConfig repositoryConfig;@Bean  public TransferService transferService() {return new TransferServiceImpl(repositoryConfig.accountRepository());}}@Configurationpublic interface RepositoryConfig {@Bean  AccountRepository accountRepository();}@Configurationpublic class DefaultRepositoryConfig implements RepositoryConfig {@Bean  public AccountRepository accountRepository() {return new JdbcAccountRepository(...);}}@Configuration@Import({ServiceConfig.class, DefaultRepositoryConfig.class}) // import the concrete config!public class SystemTestConfig {@Bean  public DataSource dataSource() {// return DataSource}}public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(SystemTestConfig.class);TransferService transferService = ctx.getBean(TransferService.class);transferService.transfer(100.00, "A123", "C456");}

现在,ServiceConfig跟具体的DefaultRepositoryConfig类是松耦合的关系,并且内嵌的IDE工具依旧有用:它很容易为开发者获取RepositoryConfig实现的类型层次。采用这种方式,导航@Configuration和它们的依赖就变得跟平常处理基于接口的代码导航没区别了。

有条件的包含@Configuration类或@Beans

基于任意的系统状态,有条件地禁用一个完整的@Configuration类,甚至单独的@Bean方法通常是很有用的。一个常见的示例是,当一个特定的profile在Spring Environment中启用时,使用@Profile注解激活beans。

@Profile注解实际上实现了一个非常灵活的注解:@Conditional。@Conditional注解意味着在注册@Bean之前,必须先咨询指定的org.springframework.context.annotation.Condition实现。

Condition接口的实现者只需简单地提供一个返回true或false的matches(…)方法。例如,下面是@Profile注解采用的Condition实现:

@Overridepublic Boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {if (context.getEnvironment() != null) {// Read the @Profile annotation attributesMultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());if (attrs != null) {for (Object value : attrs.get("value")) {if (context.getEnvironment().acceptsProfiles(((String[]) value))) {return true;}}return false;}}return true;}

具体参考@Conditional javadocs。

结合Java和XML配置

Spring @Configuration类支持目的不是想要100%的替换Spring XML。一些设施,比如Spring XML命名空间仍旧是配置容器的完美方式。在XML很方便或必须的情况下,你有个选择:采用”XML为中心”的方式实例化容器,比如ClassPathXmlApplicationContext,或使用AnnotationConfigApplicationContext以”Java为中心”的方式,并使用@ImportResource注解导入需要的XML。

在以”XML为中心”的情况下使用@Configuration类

从XML启动Spring容器,以特设模式包含@Configuration类可能是个更可选的方式。例如,在一个已经存在的使用Spring XML的大型代码库中,遵循按需原则创建@Configuration,并从现有的XML文件中包括它们是非常容易的。下面你将找到在这样的”XML为中心”的解决方案中使用@Configuration类的可选项。

记着@Configuration类本质上只是容器中的bean定义。在下面的示例中,我们创建了一个名称为AppConfig的@Configuration类,并将它作为<bean/>定义包含到system-test-config.xml中。因为<context:annotation-config/>是开启的,容器将会识别@Configuration注解,并正确地处理AppConfig中声明的@Bean方法。

@Configurationpublic class AppConfig {@Autowired  private DataSource dataSource;@Bean  public AccountRepository accountRepository() {return new JdbcAccountRepository(dataSource);}@Bean  public TransferService transferService() {return new TransferService(accountRepository());}}

ystem-test-config.xml如下:

<beans>  <!-- enable processing of annotations such as @Autowired and @Configuration -->  <context:annotation-config/>  <context:property-placeholder location="classpath:/com/acme/jdbc.properties"/>  <bean class="com.acme.AppConfig"/>  <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource">    <property name="url" value="${jdbc.url}"/>    <property name="username" value="${jdbc.username}"/>    <property name="passWord" value="${jdbc.password}"/>  </bean></beans>

jdbc.properties如下:

jdbc.propertiesjdbc.url=jdbc:hsqldb:hsql://localhost/xdbjdbc.username=sajdbc.password=

main方法如下:

public static void main(String[] args) {  ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:/com/acme/system-test-config.xml");  TransferService transferService = ctx.getBean(TransferService.class);  // ...}

: 在上面的system-test-config.xml中,AppConfig<bean/>没有声明一个id元素。如果没有bean引用它,那就没有必要指定id元素,否则就要通过name从容器获取bean(name对应bean定义中声明的id)。DataSource也一样-它只是通过类型自动注入(autowired by type),所以并不需要显式的分配一个bean id。

由于@Configuration被@Component元注解了(被注解注解,很拗口),所以被@Configuration注解的类自动成为组件扫描(component scanning)的候选者。同样使用上面的场景,我们可以重新定义system-test-config.xml来充分利用组件扫描。注意在这个示例中,我们不需要明确声明<context:annotation-config/>,因为<context:component-scan/>启用了同样的功能。

system-test-config.xml如下:

<beans>  <!-- picks up and reGISters AppConfig as a bean definition -->  <context:component-scan base-package="com.acme"/>  <context:property-placeholder location="classpath:/com/acme/jdbc.properties"/>  <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource">    <property name="url" value="${jdbc.url}"/>    <property name="username" value="${jdbc.username}"/>    <property name="password" value="${jdbc.password}"/>  </bean></beans>

在@Configuration”类为中心”的情况下使用@ImportResourcedaoru导入XML

在将@Configuration类作为配置容器的主要机制的应用中,仍旧存在对XML的需求。在那些场景中,可以使用@ImportResource,并定义所需的XML。这样做可以实现以”Java为中心”的方式配置容器,并保留最低限度的XML。

@Configuration@ImportResource("classpath:/com/acme/properties-config.xml")public class AppConfig {@Value("${jdbc.url}")  private String url;@Value("${jdbc.username}")  private String username;@Value("${jdbc.password}")  private String password;@Bean  public DataSource dataSource() {return new DriverManagerDataSource(url, username, password);}}

properties-config.xml如下:

<beans>  <context:property-placeholder location="classpath:/com/acme/jdbc.properties"/></beans>

jdbc.properties如下:

jdbc.url=jdbc:hsqldb:hsql://localhost/xdbjdbc.username=sajdbc.password=

main方法如下:

public static void main(String[] args) {  ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);  TransferService transferService = ctx.getBean(TransferService.class);  // ...}

感谢你能够认真阅读完这篇文章,希望小编分享的“Spring Java-based容器配置的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Spring Java-based容器配置的示例分析

本文链接: https://lsjlt.com/news/222556.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring Java-based容器配置的示例分析
    这篇文章主要介绍了Spring Java-based容器配置的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。装Java-based的配置使用 @Import 注解跟在...
    99+
    2023-05-31
    spring java
  • Spring中IOC容器的示例分析
    这篇文章将为大家详细讲解有关Spring中IOC容器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.Spring的IOC容器概述Spring的IOC的过程也被称为依赖注入(DI),那么对象可以...
    99+
    2023-06-03
  • spring集成httpclient配置的示例分析
    这篇文章主要介绍了spring集成httpclient配置的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、简介HttpClient是Apache Jakarta ...
    99+
    2023-06-20
  • Spring boot外部配置的示例分析
    这篇文章给大家分享的是有关Spring boot外部配置的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言在项目中为了灵活配置,我们常采用配置文件,常见的配置文件就比如xml和properties,sp...
    99+
    2023-05-30
    springboot
  • Spring Boot配置方式的示例分析
    这篇文章给大家分享的是有关Spring Boot配置方式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配...
    99+
    2023-05-30
    spring boot
  • Spring IOC容器启动示例分析
    目录一、简介二、IOC整体流程一、简介 Spring核心有两个: IOC:控制反转AOP:面向切面编程 相信大家在项目中都使用过Spring进行开发,都知道Spring非常强大,那么...
    99+
    2023-02-14
    Spring IOC容器启动流程 Spring IOC容器
  • Spring之WEB模块配置的示例分析
    小编给大家分享一下Spring之WEB模块配置的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring的WEB模块用于整合Web框架,例如Struts...
    99+
    2023-05-30
    spring web模块
  • Spring常用配置及解析类的示例分析
    这篇文章将为大家详细讲解有关Spring常用配置及解析类的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。springMVC配置用法的文章很多,但具体描述清楚的不多,这里主要介绍下常用的配置项的用法...
    99+
    2023-05-30
    spring
  • Spring Boot 中Profile配置体系的示例分析
    这篇文章将为大家详细讲解有关Spring Boot 中Profile配置体系的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Pre配置体系是基于 Spring Boot 框架开发应用程序的基础,而...
    99+
    2023-06-15
  • Spring Cloud Zuul中路由配置的示例分析
    这篇文章将为大家详细讲解有关Spring Cloud Zuul中路由配置的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先我们来回忆一下配置路由规则的那两行代码:zuul.routes.api-...
    99+
    2023-05-30
    spring cloud zuul
  • Java中Spring Boot的示例分析
    这篇文章主要介绍Java中Spring Boot的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 什么是 Spring Boot?Spring Boot 是为 Spring 服务的,是用来简化新 Spri...
    99+
    2023-06-20
  • Spring Boot定制与优化内置Tomcat容器的示例分析
    这篇文章给大家分享的是有关Spring Boot定制与优化内置Tomcat容器的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、Spring Boot 定制与优化内置Tomcat容器。> 内置的容...
    99+
    2023-05-30
    springboot tomcat
  • Java中并发容器的示例分析
    这篇文章给大家分享的是有关Java中并发容器的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、并发容器1.1 JDK 提供的并发容器总结JDK 提供的这些容器大部分在java.util.concurre...
    99+
    2023-06-15
  • Spring Web MVC和Hibernate集成配置的示例分析
    这篇文章主要介绍Spring Web MVC和Hibernate集成配置的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!添加项目依赖首先我们需要一个Java Web项目,最好使用Maven或Gradle构建工...
    99+
    2023-05-30
  • tsconfig.json配置的示例分析
    这篇文章主要为大家展示了“tsconfig.json配置的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“tsconfig.json配置的示例分析”这篇文...
    99+
    2024-04-02
  • IPTABLES配置的示例分析
    这篇文章将为大家详细讲解有关IPTABLES配置的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Iptables配置实例:  Iptables配置的目的,一个是防止公网的入侵,一个是让内...
    99+
    2023-06-13
  • VSFTP配置的示例分析
    这篇文章主要介绍了VSFTP配置的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用rpm命名可顺利安装该软件包。 # rpm -ivh vsftpd-2.0.1-5...
    99+
    2023-06-13
  • VS2003配置的示例分析
    这篇文章给大家分享的是有关VS2003配置的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面为介绍VS2003配置的全过程:(1) 直接安装VS2003(2) 安装VS2003 SP1补丁,下载地址如下...
    99+
    2023-06-17
  • Spring的示例分析
    这篇文章将为大家详细讲解有关Spring的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。WHY在诞生之初,创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB。相对于E...
    99+
    2023-05-30
    spring
  • Spring Boot配置排序依赖技巧的示例分析
    这篇文章主要介绍Spring Boot配置排序依赖技巧的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:Spring Boot - 被错误使用的注解我自己曾经在 Spring Boot 中集成通用 M...
    99+
    2023-05-30
    spring boot
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作