spring如何使用注解配置bean,spring配置类注解
目录
介绍@Bean和@ ConfigurationAnnotationConfigApplicationContext实例化容器通过使用注册(类别.)以编程方式构建容器@ComponentScan启用组件扫描豆的依赖生命周期回调豆指定作用域自定义豆名称豆别名豆注入之间的依赖@ Import @ Import资源@属性源支持多个性能文件应用上下文消息源国际化
介绍
我们将介绍如何在爪哇代码中使用注解来配置春天容器。它包括:
基本概念: @豆和@配置。使用实例化弹簧容器.注释ConfigApplicationContext。使用@Bean注释.使用@配置注释.构成基于爪哇得配置.豆定义配置文件.属性来源抽象.使用@PropertySource语句中的占位符解析.
@Bean and @Configuration
@Bean注解用在一个方法上表示实例化、配置和初始化一个新对象,由春季国际奥委会容器管理。对于那些熟悉春天的可扩展置标语言配置的人来说,@Bean注解的作用与元素的作用相同。
用@配置来注解一个类,表明它的主要目的是作为一个豆定义的来源。此外,@配置类允许通过调用同一个类中的其他@Bean方法来定义豆间的依赖关系。最简单的@配置类如下:
@ configuration公共类AppConfig { @ Bean public my service my service(){ return new my service impl();} @ Bean公共其他服务other service(){ return new other service();}}
AnnotationConfigApplicationContext实例化容器
与实例化
ClassPathXmlApplicationContext时使用Spring XML文件作为输入的方式相同,你可以在实例化注释配置应用程序上下文时使用@配置类作为输入。这使得春天容器的使用完全不需要XML,如下例子:
public static void main(String[]args){应用程序上下文CTX=new AnnotationConfigApplicationContext(appconfig。类);我的服务我的服务=CTX。获取bean(我的服务。类);我的服务。do stuff();}
通过使用 register(Class...) 以编程方式构建容器
你可以通过使用无参数构造函数来实例化注释ConfigApplicationContext,然后使用寄存器()方法来配置它。这种方法在以编程方式构建注释配置应用程序上下文时特别有用。下面的例子展示了如何做到这一点。
public static void main(String[]args){ AnnotationConfigApplicationContext CTX=new AnnotationConfigApplicationContext();ctx.register(AppConfig.class,其他配置。类);CTX。寄存器(附加配置。类);CTX。刷新();我的服务我的服务=CTX。获取bean(我的服务。类);我的服务。do stuff();}
class="maodian">
@ComponentScan启用组件扫描
为了启用组件扫描,可以在@Configuration类做如下注释。
@Configuration@ComponentScan(basePackages = "com.acme") public class AppConfig { // ...}
Bean的依赖
@Configurationpublic 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 }}@Configurationpublic 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作用域章节。
@Configurationpublic class MyConfiguration { @Bean @Scope("prototype") public Encryptor encryptor() { // ... }}
自定义bean名称
默认情况下,配置类使用@Bean方法的名称作为Bean的名称。可以通过name属性来自定义名称,如下:
@Configurationpublic class AppConfig { @Bean("myThing") public Thing thing() { return new Thing(); }}
Bean别名
@Configurationpublic class AppConfig { @Bean({"dataSource", "subsystemA-dataSource", "subsystemB-dataSource"}) public DataSource dataSource() { // instantiate, configure and return DataSource bean... }}
Bean注入之间的依赖
@Configurationpublic class AppConfig { @Bean public BeanOne beanOne() { return new BeanOne(beanTwo()); } @Bean public BeanTwo beanTwo() { return new BeanTwo(); }}
@Import
@Import注解表示要导入一个或多个@Configuration类。在导入的@Configuration类中声明的@Bean定义应该通过使用@Autowired注入来访问。
@Configurationpublic 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
@Configurationpublic class AppConfig { @Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("config/messages"); return messageSource; }}
@Servicepublic class AccountService { @Autowired private MessageSource messageSource; public void someMsg() { messageSource.getMessage("account.name", null, Locale.ENGLISH); //todo }}
以上就是详解Java如何使用注解来配置Spring容器的详细内容,更多关于Java注解配置Spring容器的资料请关注盛行IT其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。