上面两个小节一直在谈论解耦,从入门的多例到升级的单例BeanFactory工厂类是我们自己手工写的。
BeanFactory主要做了3件事:
1.读取配置文件(可以是properties或xml类型的文件,示例中用的是properties文件)
2.获取类的全限定类名,利用反射创建对象
3.把创建的对象存到一个map容器中,需要的时候根据id来拿
是时候把上面3个过程交给spring框架来完成了。
我们需要做的就是写好配置文件,把需要实例化的对象配置好id和全限定类名,spring框架会把配置好的Bean生成对象并存储在spring核心容器中。
一、新建一个maven项目,项目的目录结构如下
pom.xml中引入spring框架依赖,项目打包形式是jar包
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
二、配置beans.xml,把beans.xml放置在resources目录下
xmlns的命名空间是固定的,在结尾再补上一个</beans>
<?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">
</beans>
把对象的创建交给spring来管理,每个bean要配置id和class,这里的id和class就相当于map中的key和value,也相当于前两节中properties文件中=等号前后的两部分。前面的id用于存取对象,后面的class用于反射生成对象。只不过这个过程是由spring帮我们来完成,我们不用写工厂类自己来做。
完整的beans.xml如下:
<?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">
<!--把对象的创建交给spring来管理 -->
<bean id="accountService" class="com.company.service.impl.AccountServiceImpl">
<property name="accountDao" ref="accountDao">
</property>
</bean>
<bean id="accountDao" class="com.company.dao.impl.AccountDaoImpl"></bean>
</beans>
这里有一点需要说明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();
}
}
运行结果如下: