您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java怎么使用注解來(lái)配置Spring容器的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Java怎么使用注解來(lái)配置Spring容器文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。
我們將介紹如何在Java代碼中使用注解來(lái)配置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注解用在一個(gè)方法上表示實(shí)例化、配置和初始化一個(gè)新對(duì)象,由Spring IoC容器管理。對(duì)于那些熟悉Spring的 XML配置的人來(lái)說(shuō),@Bean注解的作用與元素的作用相同。
用@Configuration來(lái)注解一個(gè)類,表明它的主要目的是作為一個(gè)bean定義的來(lái)源。此外,@Configuration類允許通過(guò)調(diào)用同一個(gè)類中的其他@Bean方法來(lái)定義Bean間的依賴關(guān)系。最簡(jiǎn)單的@Configuration類如下:
@Configuration public class AppConfig { @Bean public MyService myService() { return new MyServiceImpl(); } @Bean public OtherService otherService() { return new OtherService(); } }
與實(shí)例化
ClassPathXmlApplicationContext時(shí)使用Spring XML文件作為輸入的方式相同,你可以在實(shí)例化AnnotationConfigApplicationContext時(shí)使用@Configuration類作為輸入。這使得Spring容器的使用完全不需要XML,如下例子:
public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); MyService myService = ctx.getBean(MyService.class); myService.doStuff(); }
你可以通過(guò)使用無(wú)參數(shù)構(gòu)造函數(shù)來(lái)實(shí)例化AnnotationConfigApplicationContext,然后使用 register() 方法來(lái)配置它。這種方法在以編程方式構(gòu)建 AnnotationConfigApplicationContext 時(shí)特別有用。下面的例子展示了如何做到這一點(diǎn)。
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(); }
為了啟用組件掃描,可以在@Configuration類做如下注釋。
@Configuration @ComponentScan(basePackages = "com.acme") public class AppConfig { // ... }
@Configuration public class AppConfig { @Bean public TransferService transferService(AccountRepository accountRepository) { return new TransferServiceImpl(accountRepository); } }
任何用@Bean注解定義的類都支持常規(guī)的生命周期回調(diào),并且可以使用JSR-250的@PostConstruct和@PreDestroy注解。如果一個(gè)bean實(shí)現(xiàn)了InitializingBean、DisposableBean或Lifecycle,它們各自的方法將被容器調(diào)用。
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默認(rèn)的作用域是singleton,更多Bean作用域可參考Bean作用域章節(jié)。
@Configuration public class MyConfiguration { @Bean @Scope("prototype") public Encryptor encryptor() { // ... } }
默認(rèn)情況下,配置類使用@Bean方法的名稱作為Bean的名稱。可以通過(guò)name屬性來(lái)自定義名稱,如下:
@Configuration public class AppConfig { @Bean("myThing") public Thing thing() { return new Thing(); } }
@Configuration public class AppConfig { @Bean({"dataSource", "subsystemA-dataSource", "subsystemB-dataSource"}) public DataSource dataSource() { // instantiate, configure and return DataSource bean... } }
@Configuration public class AppConfig { @Bean public BeanOne beanOne() { return new BeanOne(beanTwo()); } @Bean public BeanTwo beanTwo() { return new BeanTwo(); } }
@Import注解表示要導(dǎo)入一個(gè)或多個(gè)@Configuration類。在導(dǎo)入的@Configuration類中聲明的@Bean定義應(yīng)該通過(guò)使用@Autowired注入來(lái)訪問(wèn)。
@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(); } }
現(xiàn)在,在實(shí)例化上下文時(shí)不需要同時(shí)指定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); }
Spring提供了一個(gè)@ImportResource注解,用于從applicationContext.xml文件中加載bean到應(yīng)用上下文中。
@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來(lái)讀取屬性文件,并用@Value和Environment來(lái)顯示值。
@PropertySource注解為向Spring的環(huán)境添加PropertySource提供了一種方便的聲明性機(jī)制。要與@Configuration類一起使用。
假設(shè)我們從config.properties文件中讀取數(shù)據(jù)庫(kù)配置,并使用Environment將這些屬性值設(shè)置為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()); } }
@Configuration @PropertySources({ @PropertySource("classpath:config.properties"), @PropertySource("classpath:db.properties") }) public class AppConfig { //... }
ApplicationContext實(shí)現(xiàn)了BeanFactory接口,并提供了如下功能:
通過(guò)MessageSource接口,訪問(wèn)i18n風(fēng)格的消息。
通過(guò)ResourceLoader接口訪問(wèn)資源,如URL和文件。
事件發(fā)布,即通過(guò)使用ApplicationEventPublisher接口,向?qū)崿F(xiàn)ApplicationListener接口的bean發(fā)布。
通過(guò)HierarchicalBeanFactory接口加載多個(gè)(分層的)上下文,讓每個(gè)上下文專注于一個(gè)特定的層,例如一個(gè)應(yīng)用程序的Web層。
ApplicationContext接口擴(kuò)展了一個(gè)名為MessageSource的接口,因此,它提供了國(guó)際化("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 } }
關(guān)于“Java怎么使用注解來(lái)配置Spring容器”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Java怎么使用注解來(lái)配置Spring容器”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。