成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring框架之基于Java的容器注解

開發 后端
本篇我們將介紹如何在Java代碼中使用注解來配置Spring容器。希望能夠幫助到你!

我們將介紹如何在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
}
}
責任編輯:姜華 來源: 今日頭條
相關推薦

2022-05-30 11:17:44

Spring容器配置

2022-05-30 09:32:07

Spring容器

2019-10-18 16:05:32

框架開發Java

2022-06-07 07:58:45

SpringSpring AOP

2009-06-19 09:52:46

Acegi安全框架Spring框架

2022-05-27 08:25:55

容器Spring

2022-06-08 08:04:28

Springservicerepository

2022-02-19 07:41:36

Bean注解項目

2021-07-09 07:52:34

SpringContextEventListen

2022-02-20 07:28:13

Spring注解用法

2009-06-19 17:17:40

Spring框架Java

2016-01-05 10:35:04

JavaSpringJavaConfig

2009-05-11 10:27:32

Spring Batc配置工作劃分

2009-12-09 09:57:05

ibmdwJavaPHP

2019-11-22 09:40:40

SpringJava編程語言

2016-03-21 17:08:54

Java Spring注解區別

2025-02-28 08:16:14

Spring框架注解

2011-07-19 09:38:41

一維數組Junit靜態成員

2024-04-02 09:32:08

Spring@Retry開發者

2021-03-08 00:11:02

Spring注解開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩综合网| 国产成人一区 | hsck成人网 | 国产一区二区免费 | 午夜免费看视频 | 日韩专区中文字幕 | 欧美一区二区 | 国产在线观看一区二区 | 国产色黄 | 亚洲91精品| 亚洲视频一区二区三区 | 99精品欧美| 国产精品污www在线观看 | 成人在线一区二区三区 | 国产在线中文字幕 | 成人在线播放网站 | 九九99久久 | 成人做爰www免费看 午夜精品久久久久久久久久久久 | 最新超碰| 国产成人精品福利 | 日韩在线一区二区三区 | 一区二区三区精品视频 | 国产成人精品一区二区 | 国产精品久久久久久久久久免费看 | h片免费在线观看 | 欧美日韩视频在线第一区 | 免费骚视频 | 美女高潮网站 | 97福利在线 | 野狼在线社区2017入口 | 国产色在线 | 国产91一区二区三区 | 亚洲精品一区二区三区蜜桃久 | 91网视频| 欧美日韩国产三级 | 欧美国产精品一区二区三区 | 伊人精品一区二区三区 | 亚洲三级免费看 | 日韩日韩日韩日韩日韩日韩日韩 | 成人精品国产免费网站 | 成人欧美一区二区三区 |