当前位置: 首页 > 科技观察

Spring框架基于Java的容器注解

时间:2023-03-12 17:08:57 科技观察

我们将介绍如何在Java代码中使用注解来配置Spring容器。它包括:基本概念:@Bean和@Configuration。使用实例化Spring容器。AnnotationConfigApplicationContext。使用@Bean注解。使用@Configuration注解。编写基于Java的配置。Bean定义配置文件。PropertySource抽象。使用@PropertySource。语句中的占位符解析。@Bean和@Configuration@Bean注释用于实例化、配置和初始化由SpringIoC容器管理的新对象的方法。对于那些熟悉Spring的XML配置的人来说,@Bean注释与元素的作用相同。用@Configuration注释一个类表明它的主要目的是作为bean定义的来源。此外,@Configuration类允许通过调用同一类中的其他@Bean方法来定义Bean间依赖关系。最简单的@Configuration类如下:@ConfigurationpublicclassAppConfig{@BeanpublicMyServicemyService(){returnnewMyServiceImpl();}@BeanpublicOtherServiceotherService(){returnnewOtherService();}}AnnotationConfigApplicationContext实例化容器和实例与实例化ClassPathXmlApplicationContext时使用SpringXML文件作为输入的方式相同,您可以在实例化AnnotationConfigApplicationContext时使用@Configuration类作为输入。这使得Spring容器的使用完全不需要XML,如下例所示:publicstaticvoidmain(String[]args){我的服务myService=ctx.getBean(MyService.class);我的服务。doStuff();}使用register(Class...)以编程方式构建容器您可以使用无参数构造函数实例化AnnotationConfigApplicationContext,然后使用register()方法对其进行配置。在以编程方式构建AnnotationConfigApplicationContext时,此方法特别有用。以下示例显示了如何执行此操作。publicstaticvoidmain(String[]args){AnnotationConfigApplicationContextctx=newAnnotationConfigApplicationContext();ctx.register(AppConfig.class,OtherConfig.class);ctx.register(AdditionalConfig.class);ctx.refresh();我的服务myService=ctx.getBean(MyService.class);myService.doStuff();}@ComponentScan启用组件扫描要启用组件扫描,可以在@Configuration类中做如下注解。@Configuration@ComponentScan(basePackages="com.acme")publicclassAppConfig{//...}Bean依赖关系@ConfigurationpublicclassAppConfig{@BeanpublicTransferServicetransferService(AccountRepositoryaccountRepository){returnnewTransferServiceImpl(accountRepository);}}生命周期回调任何用@Bean注解定义的类都支持常规的生命周期回调,可以使用JSR-250@PostConstruct和@PreDestroy注解。如果一个bean实现了InitializingBean、DisposableBean或Lifecycle,它们各自的方法将被容器调用。publicclassBeanOne{publicvoidinit(){//初始化逻辑}}publicclassBeanTwo{publicvoidcleanup(){//销毁逻辑}}@ConfigurationpublicclassAppConfig{@Bean(initMethod="init")publicBeanOnebeanOne(){返回新的BeanOne();}@Bean(destroyMethod="cleanup")publicBeanTwobeanTwo(){returnnewBeanTwo();}}Bean指定作用域Bean的默认作用域是单例,更多的Bean作用域可以参考Bean作用域章节。@ConfigurationpublicclassMyConfiguration{@Bean@Scope("prototype")publicEncryptorencryptor(){//...}}自定义bean名称默认情况下,配置类使用@Bean方法的名称作为bean名称。可以通过name属性自定义名称,如下:@ConfigurationpublicclassAppConfig{@Bean("myThing")publicThingthing(){returnnewThing();}}Bean别名@ConfigurationpublicclassAppConfig{@Bean({"dataSource","subsystemA-dataSource","subsystemB-dataSource"})publicDataSourcedataSource(){//实例化、配置和返回DataSourcebean...}}Bean注入之间的依赖@ConfigurationpublicclassAppConfig{@BeanpublicBeanOnebeanOne(){returnnewBeanOne(beanTwo());}@BeanpublicBeanTwobeanTwo(){返回新的BeanTwo();}}@Import@Import注释表示要导入一个或多个@Configuration类。在导入的@Configuration类中声明的@Bean定义应该使用@Autowired注入来访问。@ConfigurationpublicclassConfigA{@BeanpublicAa(){returnnewA();}}@Configuration@Import(ConfigA.class)publicclassConfigB{@BeanpublicBb(){returnnewB();现在,无需在实例化上下文时同时指定ConfigA类和ConfigB类,只需显式提供ConfigB:publicstaticvoidmain(String[]args){//现在beanA和B都可用了...Aa=ctx.getBean(A.class);Bb=ctx.getBean(B.class);}@ImportResourceSpring提供了一个@ImportResource注解,用于从applicationContext.xml文件中导入,以将bean加载到应用程序上下文中。@Configuration@ImportResource("classpath:/com/acme/properties-config.xml")publicclassAppConfig{@Value("${jdbc.url}")privateStringurl;@Value("${jdbc.username}")私有字符串用户名;@Value("${jdbc.password}")私有字符串密码;@BeanpublicDataSourcedataSource(){returnnewDriverManagerDataSource(url,username,password);}}@PropertySource我们将讨论如何使用@PropertySource读取属性文件并使用@Value和Environment显示值。@PropertySource注释提供了一种方便的声明机制,用于将PropertySources添加到Spring的环境中。与@Configuration类一起使用。假设我们从config.properties文件中读取数据库配置,使用Environment将这些属性值设置到DataSourceConfig类中。@Configuration@PropertySource("classpath:config.properties")publicclassProperySourceDemoimplementsInitializingBean{@AutowiredEnvironmentenv;@OverridepublicvoidafterPropertiesSet()throwsException{setDatabaseConfig();();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());}}支持多个属性文件@Configuration@PropertySources({@PropertySource("classpath:config.properties"),@PropertySource("classpath:db.properties")})publicclassAppConfig{//...}ApplicationContextApplicationContext实现了BeanFactory接口,并提供以下功能:通过MessageSource接口访问i18n风格的消息。通过ResourceLoader接口访问URL和文件等资源。发布事件,即通过ApplicationEventPublisher接口发布到实现了ApplicationListener接口的bean。通过HierarchicalBeanFactory接口加载多个(分层的)上下文,让每个上下文专注于特定层,例如应用程序的Web层。MessageSource国际化ApplicationContext接口扩展了一个名为MessageSource的接口,因此它提供了国际化(“i18n”)功能。Spring还提供了HierarchicalMessageSource接口,可以分层解析消息。account.name=TestAccount@ConfigurationpublicclassAppConfig{@BeanpublicMessageSourcemessageSource(){ResourceBundleMessageSourcemessageSource=newResourceBundleMessageSource();}messageSource.setBasename("配置/消息");返回消息源;}}@ServicepublicAutoprivateAccountMessageSourcemessageSource;publicvoidsomeMsg(){messageSource.getMessage("account.name",null,Locale.ENGLISH);//去做}}