广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解Java如何使用注解来配置Spring容器
  • 577
分享到

详解Java如何使用注解来配置Spring容器

2024-04-02 19:04:59 577人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录介绍@Bean and @ConfigurationAnnotationConfigApplicationContext实例化容器通过使用 reGISter(Class...)

介绍

我们将介绍如何在Java代码中使用注解来配置spring容器。它包括:

  • 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。

@Bean and @Configuration

@Bean注解用在一个方法上表示实例化、配置和初始化一个新对象,由Spring ioc容器管理。对于那些熟悉Spring的 XML配置的人来说,@Bean注解的作用与元素的作用相同。

用@Configuration来注解一个类,表明它的主要目的是作为一个bean定义的来源。此外,@Configuration类允许通过调用同一个类中的其他@Bean方法来定义Bean间的依赖关系。最简单的@Configuration类如下:

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    } 
    @Bean
    public OtherService otherService() {
        return new OtherService();
    }
}

AnnotationConfigApplicationContext实例化容器

与实例化

ClassPathXmlApplicationContext时使用Spring XML文件作为输入的方式相同,你可以在实例化AnnotationConfigApplicationContext时使用@Configuration类作为输入。这使得Spring容器的使用完全不需要XML,如下例子:

public static void main(String[] args) {
    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
    MyService myService = ctx.getBean(MyService.class);
    myService.doStuff();
}

通过使用 register(Class...) 以编程方式构建容器

你可以通过使用无参数构造函数来实例化AnnotationConfigApplicationContext,然后使用 register() 方法来配置它。这种方法在以编程方式构建 AnnotationConfigApplicationContext 时特别有用。下面的例子展示了如何做到这一点。

public static void main(String[] args) {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    ctx.register(AppConfig.class, OtherConfig.class);
    ctx.register(AdditionalConfig.class);
    ctx.refresh();
    MyService myService = ctx.getBean(MyService.class);
    myService.doStuff();
}

@ComponentScan启用组件扫描

为了启用组件扫描,可以在@Configuration类做如下注释。

@Configuration
@ComponentScan(basePackages = "com.acme") 
public class AppConfig  {
    // ...
}

Bean的依赖

@Configuration
public class AppConfig {
    @Bean
    public TransferService transferService(AccountRepository accountRepository) {
        return new TransferServiceImpl(accountRepository);
    }
}

生命周期回调

任何用@Bean注解定义的类都支持常规的生命周期回调,并且可以使用jsR-250的@PostConstruct和@PreDestroy注解。如果一个bean实现了InitializingBean、DisposableBean或Lifecycle,它们各自的方法将被容器调用。

public class BeanOne {

    public void init() {
        // initialization logic
    }
}
public class BeanTwo {

    public void cleanup() {
        // destruction logic
    }
}
@Configuration
public class AppConfig {

    @Bean(initMethod = "init")
    public BeanOne beanOne() {
        return new BeanOne();
    }
    @Bean(destroyMethod = "cleanup")
    public BeanTwo beanTwo() {
        return new BeanTwo();
    }
}

Bean指定作用域

Bean默认的作用域是singleton,更多Bean作用域可参考Bean作用域章节。

@Configuration
public class MyConfiguration {
    @Bean
    @Scope("prototype")
    public Encryptor encryptor() {
        // ...
    }
}

自定义bean名称

默认情况下,配置类使用@Bean方法的名称作为Bean的名称。可以通过name属性来自定义名称,如下:

@Configuration
public class AppConfig {
    @Bean("myThing")
    public Thing thing() {
        return new Thing();
    }
}

Bean别名

@Configuration
public class AppConfig {
    @Bean({"dataSource", "subsystemA-dataSource", "subsystemB-dataSource"})
    public DataSource dataSource() {
        // instantiate, configure and return DataSource bean...
    }
}

Bean注入之间的依赖

@Configuration
public class AppConfig {
    @Bean
    public BeanOne beanOne() {
        return new BeanOne(beanTwo());
    }
    @Bean
    public BeanTwo beanTwo() {
        return new BeanTwo();
    }
}

@Import

@Import注解表示要导入一个或多个@Configuration类。在导入的@Configuration类中声明的@Bean定义应该通过使用@Autowired注入来访问。

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

现在,在实例化上下文时不需要同时指定ConfigA类和ConfigB类,而只需要明确提供ConfigB:

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);
}

@ImportResource

Spring提供了一个@ImportResource注解,用于从applicationContext.xml文件中加载bean到应用上下文中。

@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>

@PropertySource

我们将讨论如何使用@PropertySource来读取属性文件,并用@Value和Environment来显示值。

@PropertySource注解为向Spring的环境添加PropertySource提供了一种方便的声明性机制。要与@Configuration类一起使用。

假设我们从config.properties文件中读取数据库配置,并使用Environment将这些属性值设置为DataSourceConfig类。

@Configuration
@PropertySource("classpath:config.properties")
public class ProperySourceDemo implements InitializingBean {
    @Autowired
    Environment env;
    @Override
    public void afterPropertiesSet() throws Exception {
        setDatabaseConfig();
    }
    private void setDatabaseConfig() {
        DataSourceConfig config = new DataSourceConfig();
        config.setDriver(env.getProperty("jdbc.driver"));
        config.setUrl(env.getProperty("jdbc.url"));
        config.setUsername(env.getProperty("jdbc.username"));
        config.setPassword(env.getProperty("jdbc.password"));
        System.out.println(config.toString());
    }
}

支持多个properties文件

@Configuration
 @PropertySources({
  @PropertySource("classpath:config.properties"),
  @PropertySource("classpath:db.properties")
 })
 public class AppConfig {
  //...
 }

ApplicationContext

ApplicationContext实现了BeanFactory接口,并提供了如下功能:

  • 通过MessageSource接口,访问i18n风格的消息。
  • 通过ResourceLoader接口访问资源,如URL和文件。
  • 事件发布,即通过使用ApplicationEventPublisher接口,向实现ApplicationListener接口的bean发布。
  • 通过HierarchicalBeanFactory接口加载多个(分层的)上下文,让每个上下文专注于一个特定的层,例如一个应用程序的WEB层。

MessageSource 国际化

ApplicationContext接口扩展了一个名为MessageSource的接口,因此,它提供了国际化("i18n")功能。Spring还提供了HierarchicalMessageSource接口,它可以分层次地解析消息。

account.name=TestAccount
@Configuration
public class AppConfig {
    @Bean
    public MessageSource messageSource() {
      ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
      messageSource.setBasename("config/messages");
      return messageSource;
    }
}
@Service
public class AccountService {
    @Autowired
    private MessageSource messageSource;
    
    public void someMsg() {
        messageSource.getMessage("account.name", null, Locale.ENGLISH);
        //todo
    }
}

以上就是详解Java如何使用注解来配置Spring容器的详细内容,更多关于Java注解配置Spring容器的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解Java如何使用注解来配置Spring容器

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Java如何使用注解来配置Spring容器
    目录介绍@Bean and @ConfigurationAnnotationConfigApplicationContext实例化容器通过使用 register(Class...) ...
    99+
    2022-11-13
  • Java怎么使用注解来配置Spring容器
    这篇文章主要介绍了Java怎么使用注解来配置Spring容器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么使用注解来配置Spring容器文章都会有所收获,下面我们一起来看看吧。介绍我们将介绍如何在J...
    99+
    2023-07-02
  • 如何使用注解配置Spring容器
    这篇文章给大家分享的是有关如何使用注解配置Spring容器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:@Configuration标注在类上,相当于将该类作为spring的xml的标签@Configu...
    99+
    2023-05-30
    spring
  • 使用Spring MVC4 如何配置注解
    使用Spring MVC4 如何配置注解?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在传统的Spring项目中,我们要写一堆的XML文件。而这些XML文件格式...
    99+
    2023-05-31
    springmvc 注解配置
  • 使用Spring Aop如何配置AspectJ注解
    这篇文章将为大家详细讲解有关使用Spring Aop如何配置AspectJ注解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。采用的jdk代理,接口和实现类代码请参考上篇博文。主要是将Aspe...
    99+
    2023-05-31
    springaop aspectj
  • Java Spring详解如何配置数据源注解开发以及整合Junit
    目录Spring数据源的配置数据源(连接池)的作用数据源的开发步骤手动创建数据源Spring注解开发Spring原始注解Spring新注解Spring整合JunitSpring集成J...
    99+
    2022-11-12
  • Spring-IOC容器中的常用注解与使用方法详解
    Spring是什么? Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的Java...
    99+
    2022-11-12
  • 详解spring如何使用注解开发
    在Spring4之后,要使用注解开发,必须要保证aop的包导入了。 使用注解需要导入context约束,增加注解的支持。 <?xml version="1.0" ...
    99+
    2022-11-12
  • Java详解swagger2如何配置使用
    目录1、引入jar包2、启用swagger application.properties3、配置文件swagger可能会遇到的问题: 当我们的接口返回的数据太大的时候,swagger...
    99+
    2022-11-13
  • 如何使用Spring中的scope配置和@scope注解
    本文小编为大家详细介绍“如何使用Spring中的scope配置和@scope注解”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用Spring中的scope配置和@scope注解”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-07-02
  • Java中如何使用Spring注解
    Java中如何使用Spring注解,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Spring4之后,要使用注解开发,必须要保证aop的包导入了使用注解需要导入contex...
    99+
    2023-06-20
  • Spring容器的创建过程之如何注册BeanPostProcessor详解
    注册BeanPostProcessor refresh()调用registerBeanPostProcessors(beanFactory)方法,注册Bean的后置处理器,后置处理器...
    99+
    2022-11-12
  • Spring 中的事务管理如何使用注解实现配置
    Spring 中的事务管理如何使用注解实现配置?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用步骤:步骤一、在spring配置文件中引入<tx:>命名空间&l...
    99+
    2023-05-31
    spring 注解 事务管理
  • 如何使用纯java config来配置spring mvc方式
    这篇文章将为大家详细讲解有关如何使用纯java config来配置spring mvc方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。使用xml配置spring是大部分...
    99+
    2023-06-21
  • Spring如何利用@Value注解读取yml中的map配置
    目录@Value注解读取yml中的map配置下边是我在yml中的map写法使用时候注解的写法举个例子spring注解@Value通过yml文件注入mapyml文件java代码注入@V...
    99+
    2022-11-13
  • Spring CORS 跨域使用与原理(@CrossOrigin注解,Java配置类方式,xml方式)
    Spring CORS 跨域使用与原理(@CrossOrigin注解,Java配置类方式,xml方式) 出于安全原因,浏览器禁止AJAX调用当前源之外的资源。 跨域资源共享(CORS)是由大多数...
    99+
    2023-09-15
    java spring xml spring boot 服务器
  • 如何使用PyCharm及常用配置详解
    目录一、Python 的 IDE —— PyCharm1.1 集成开发环境(IDE)1.2 PyCharm 介绍二、PyCharm上手使用2.1 创建Python项目2.2 新建Py...
    99+
    2022-11-12
  • 一文详解在Go中如何使用Viper来管理配置
    目录为什么选择 Viper把配置值读入 Viper设置默认配置值从配置文件读取配置监控并重新读取配置文件从 io.Reader 读取配置从环境变量读取配置从命令行...
    99+
    2023-05-19
    Go使用Viper管理配置 Go Viper管理配置 Go Viper
  • 如何使用 PHP 解析 Spring 框架中的配置文件?
    Spring 是一个流行的 Java 开发框架,被广泛应用于企业级应用开发中。在 Spring 框架中,配置文件起着至关重要的作用,因为它们描述了应用程序中各个组件之间的关系,并提供了各种配置选项,以满足不同应用程序的需求。本文将介绍如何使...
    99+
    2023-07-02
    spring 文件 javascript
  • 如何使用 Python 解析 Spring 框架中的配置文件?
    Spring 框架是一个广泛使用的 Java 应用程序框架,它的主要特点是将业务逻辑与底层代码分离。在 Spring 中,应用程序的配置文件扮演着至关重要的角色,它们描述了应用程序的各种设置和配置,如数据库连接、日志设置、Web 应用程序上...
    99+
    2023-09-04
    文件 关键字 spring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作