上面两个小节一直在谈论解耦,从入门的多例到升级的单例BeanFactory工厂类是我们自己手工写的。
BeanFactory主要做了3件事:
1.读取配置文件(可以是properties或xml类型的文件,示例中用的是properties文件)
2.获取类的全限定类名,利用反射创建对象
3.把创建的对象存到一个map容器中,需要的时候根据id来拿
是时候把上面3个过程交给spring框架来完成了。
我们需要做的就是写好配置文件,把需要实例化的对象配置好id和全限定类名,spring框架会把配置好的Bean生成对象并存储在spring核心容器中。
一、新建一个maven项目,项目的目录结构如下
pom.xml中引入spring框架依赖,项目打包形式是jar包
jar org.springframework spring-context 5.0.2.RELEASE
二、配置beans.xml,把beans.xml放置在resources目录下
xmlns的命名空间是固定的,在结尾再补上一个
把对象的创建交给spring来管理,每个bean要配置id和class,这里的id和class就相当于map中的key和value,也相当于前两节中properties文件中=等号前后的两部分。前面的id用于存取对象,后面的class用于反射生成对象。只不过这个过程是由spring帮我们来完成,我们不用写工厂类自己来做。
完整的beans.xml如下:
这里有一点需要说明id="accountService"的bean中多了一个property属性,是因为后面在代码中service调dao的save方法,因此service对象实例化的时候同时也要实例化一个dao对象。Bean的实例化后面还会介绍这里先这样使用。
AccountServiceImpl.java文件的内容如下:
package com.company.service.impl;import com.company.dao.IAccountDao;
import com.company.dao.impl.AccountDaoImpl;
import com.company.service.IAccountService;public class AccountServiceImpl implements IAccountService {private IAccountDao accountDao;public void setAccountDao(AccountDaoImpl accountDao) {this.accountDao=accountDao;}public void save() {accountDao.save();}
}
三、controller中写测试方法调用dao层的数据保存
spring的IOC核心容器ApplicationContext,并根据id获取对象,相当于一个map集合。
这样就实现了一个基本spring案例。
package com.company.controller;import com.company.dao.IAccountDao;
import com.company.service.IAccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class WebClient {public static void main(String[] args) {//1.获取核心容器对象ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");//2.根据id获取Bean对象IAccountService accountService =(IAccountService) ac.getBean("accountService");//3.调用IAccountService的save方法accountService.save();}
}
运行结果如下: