Spring中IoC - 两种ApplicationContext加载Bean的配置

说明:Spring IoC其实就是在Service的实现中定义了一些以来的策略类,这些策略类不是通过 初始化、Setter、工厂方法来确定的。而是通过一个叫做上下文的(ApplicationContext)组建来加载进来的。这里介绍两种Context组建的构件过程

前提条件:在Gradle工程的build.gradle文件中引入对Spring framework 的支持

repositories {
    mavenCentral()
}

dependencies {
    compile group: ‘org.springframework‘,name: ‘spring-context‘, version: ‘4.1.5.RELEASE‘
    compile group: ‘org.springframework‘,name: ‘spring-core‘, version: ‘4.1.5.RELEASE‘
    testCompile group: ‘junit‘, name: ‘junit‘, version: ‘4.11‘
}

 

  1. 第一种方式:AnnotationConfigApplicationContext类加载JavaClass File的配置文件

配置文件JavaClass如下:

@Configuration:表示这是一个配置文件

@Bean: 表示这是一个Bean(名字为方法名),将来他要用来与Service中的@Autowired属性配对,注意配对的时候是根据返回类型来对应的,也就是说所有的Service中但凡有@Autowired的属性,他们都是从这个配置文件中拿到的。

@Configuration
public class ApplicationContextConfiguration {
    @Bean
    public AccountRepoisitory accountRepoisitory() {
        return new AccountRepositoryImp();
    }

    @Bean
    public TransactionService transactionService() {
        return new TransactionServiceImp();
    }

    @Bean
    public TransferService transferService() {
        return new TransferServiceImp();
    }
}

再来看一下使用@AutoWired的Service类。这个AutoWired将与上面配置文件中的@Bean结成一对儿

public class TransactionServiceImp implements TransactionService {

    @Autowired
    public  AccountRepoisitory accountRepoisitory;
    @Override
    public void NewTransaction(String accountId1, String accountId2, double money) {
        Account account1=accountRepoisitory.GetAccountByAccountId(accountId1);
        Account account2=accountRepoisitory.GetAccountByAccountId(accountId2);
        Transaction transaction=new Transaction(){ };
        transaction.fromAccount=account1;
        transaction.toAccount=account2;
        transaction.moneyTransfered=money;
        transaction.transactionDate= Calendar.getInstance().getTime();

        BankFactory.Transactions.add(transaction);
    }
}

 

最后来看Main函数是如何将配置文件与Service文件结合在一起的。 很简单

  ApplicationContext context=
                new AnnotationConfigApplicationContext(
                        com.ctrip.configuration.ApplicationContextConfiguration.class
                );

// 接下来我们就可以使用任何Service中定义的方法了
AccountRepoisitory accountRepoisitory=context.getBean("accountRepoisitory",
AccountRepositoryImp.class);

TransactionService transactionService=context.getBean("transactionService",
TransactionServiceImp.class);

TransferService transferService=context.getBean("transferService",
TransferServiceImp.class
);
transferService.Transfer("1","2",234);
 

 

  1. 第二种方式:通过ClassPathXmlApplicationContext加载xml配置文件

首先是在resources/META-INFO/Config下面新建一个Beans definition 的xml如下(注意这个地址至今我也不理解,放在其他的目录下老失败。好吧先mark了)

Property中定义了每个Bean中涉及的Property。 注意这个地方因为是对属性的赋值,所以在你的Service类中必须支持Setter方法

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

              <bean id="accountRepoisitory" class="com.ctrip.depends.AccountRepositoryImp"></bean>
              <bean id="transactionService" class="com.ctrip.depends.TransactionServiceImp">
                     <property name="accountRepoisitory" ref="accountRepoisitory"></property>
              </bean>
              <bean id="transferService" class="com.ctrip.depends.TransferServiceImp">
                     <property name="accountRepoisitory" ref="accountRepoisitory"></property>
                     <property name="transactionService" ref="transactionService"></property>
              </bean>
</beans>

在Main方法中使用其实也很简单

    ApplicationContext context=new ClassPathXmlApplicationContext("classpath:/META-INF/config/application-context.xml");
        Transfer(context);

//通过以上的步骤我们告诉了每个Service的存在和他们所依赖的Service,接下来可以使用任何Service中的方法了
AccountRepoisitory accountRepoisitory=context.getBean("accountRepoisitory",
AccountRepositoryImp.class);

TransactionService transactionService=context.getBean("transactionService",
TransactionServiceImp.class);

TransferService transferService=context.getBean("transferService",
TransferServiceImp.class
);
transferService.Transfer("1","2",234);
 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。