该接口org.springframework.context.ApplicationContext
代表Spring IoC容器,负责实例化,配置和组装bean。容器通过读取配置元数据获取有关要实例化,配置和组装的对象的指令。配置元数据以XML,Java注释或Java代码表示。它允许您表达组成应用程序的对象以及这些对象之间丰富的相互依赖性。
ApplicationContext
Spring的开箱即用的几个接口实现。在独立应用程序中,通常创建ClassPathXmlApplicationContext
或的实例FileSystemXmlApplicationContext
。
虽然XML是定义配置元数据的传统格式,但您可以通过提供少量XML配置来声明性地支持这些其他元数据格式,从而指示容器使用Java注释或代码作为元数据格式。
接下来就开始演示ioc容器如何使用
1.配置元数据
演示的例子描述了Person的业务层访问 personDao层,personDao层成访问实体类的例子
对应person的实体类
/**
* @Project: spring
* @description: person实体类
* @author: sunkang
* @create: 2018-09-11 10:42
* @ModificationHistory who when What
**/
public class Person {
private String username;
private int age;
private String addr;
public Person(String username, int age, String addr) {
this.username = username;
this.age = age;
this.addr = addr;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "Person{" +
"username='" + username + '\'' +
", age=" + age +
", addr='" + addr + '\'' +
'}';
}
}
接下来是person的dao层
/**
* @Project: spring
* @description: person 数据访问层
* @author: sunkang
* @create: 2018-09-11 10:51
* @ModificationHistory who when What
**/
public class PersonDao {
public Person findPersonByUsername(String username){
return new Person(username,20,"hangzhou");
}
}
接下来是业务层
/**
* @Project: spring
* @description: person 业务处理类
* @author: sunkang
* @create: 2018-09-11 10:50
* @ModificationHistory who when What
**/
public class PersonService {
private PersonDao personDao;
private String serviceName;
public Person findPersonByUsername(String userName){
return personDao.findPersonByUsername(userName);
}
public PersonDao getPersonDao() {
return personDao;
}
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
public String getServiceName() {
return serviceName;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
}
想想person的业务层如何dao层如何进行关联呢?
接下来看看在xml的具体配置
PersonDao在spring-dao.xml中的配置
PersonService在spring-service.xml中的配置
配置了解完了,接下来,了解如何进行加载配置,并完成ioc的加载,
想想如何同时加载spring-dao.xml和spring-service.xml的配置
2.实例化容器 和使用容器
在讲解实例化容器之前,比如我有多个xml配置,我想放到一起组合加载该如何配置
可以使用import可以引入多个文件加载bean定义
在spring-compose.xml的配置如下
其实除了普通的xml配置之外,spring还支持Groovy Bean定义DSL,这个该如何配置
groovy-dao.groovy描述了personDao这个类的配置方法
package ContailerOverview
import com.spring.ContailerOverview.PersonDao
beans {
personDao(PersonDao) {
}
}
groovy-service.groovy描述了personService这个类的配置方法
package ContailerOverview
import com.spring.ContailerOverview.PersonService
beans {
personService(PersonService) {
serviceName = "personService"
personDao = personDao
}
}
接下来一起来看如何使用ioc容器来加载普通xml的配置和groovy文件的配置
加载普通xml配置有下面的几种方式:
- 可以用
ClassPathXmlApplicationContext
加载classPath路径完成容器加载- 可以用
FileSystemXmlApplicationContext
系统路径加载容器- 可以用
GenericApplicationContext和XmlBeanDefinitionReade
r结合使用来加载
加载groovy文件配置可以用使用
- 使用
GenericGroovyApplicationContext
的容器里加载- 使用
GenericApplicationContext和GroovyBeanDefinitionReader
结合使用
项目用到的是maven的来管理jar包的,所以需要如下的配置,需要增加两个jar包的依赖
一个使用的spring-context的jar,一个是groovy需要的jar,由于spring5不在支持jdk1.8一下的版本,spring5中用到了jdk8的新语法lamba表达式,所以不在对低于jdk1.8版本的兼容
org.springframework
spring-context
5.0.4.RELEASE
org.codehaus.groovy
groovy-all
2.4.12
接下来演示ioc容器的加载和容器如何使用的
注意,该配置文件我都在resources下的ContailerOverview目录中,所以配置文件加载会有这个前缀,后期代码会公布,具体的地址请看sprig框架系列第一遍
/**
* @Project: spring
* @description:读取容器
*
* 一般的加载方式:
* 方式1: 可以用ClassPathXmlApplicationContext加载classPath路径完成容器加载
* 方式2: 可以用FileSystemXmlApplicationContext 系统路径加载容器
* 方式3:可以用GenericApplicationContext和XmlBeanDefinitionReader结合使用来加载
*
* 另外也可以加载组合文件
* 读取groovy的配置文件需要groovy-all.jar的支持
* 加载groovy 可以用使用
* 1.使用GenericGroovyApplicationContext的容器里加载
* 2.使用GenericApplicationContext和GroovyBeanDefinitionReader结合使用
*
* @author: sunkang
* @create: 2018-09-11 11:00
* @ModificationHistory who when What
**/
public class ApplicationBootstrap {
public static void main(String[] args) {
/*-----------------------------------加载spring的xml配置文件-----------------------------*/
//1.一次性读取多个文件
ApplicationContext context = new ClassPathXmlApplicationContext("ContailerOverview/spring-dao.xml", "ContailerOverview/spring-service.xml");
PersonService personService= context.getBean("personService",PersonService.class);
Person person = personService.findPersonByUsername("sunkang");
System.out.println(person);
//2.读取组合文件
// //用 ClassPathXmlApplicationContext来读取
// ApplicationContext context1 = new ClassPathXmlApplicationContext("spring-compose.xml");
String filePath=ApplicationBootstrap.class.getClassLoader().getResource("").getPath()+ "ContailerOverview/spring-compose.xml";
System.out.println(filePath);
//用FileSystemXmlApplicationContext来读取
ApplicationContext context1= new FileSystemXmlApplicationContext(filePath);
PersonService personService1= context1.getBean("personService",PersonService.class);
System.out.println(personService1.findPersonByUsername("wangzezhi"));
//3.灵活的变体GenericApplicationContext和XmlBeanDefinitionReader结合使用
GenericApplicationContext context2 = new GenericApplicationContext();
new XmlBeanDefinitionReader(context2).loadBeanDefinitions("ContailerOverview/spring-dao.xml", "ContailerOverview/spring-service.xml");
context2.refresh();
/*-----------------------------------加载groovy的文件-----------------------------*/
//4.使用groovy 文件配置
ApplicationContext context3 = new GenericGroovyApplicationContext("ContailerOverview/groovy-dao.groovy", "ContailerOverview/groovy-service.groovy");
PersonService personService3= context3.getBean("personService",PersonService.class);
System.out.println(personService3.findPersonByUsername("sunkang"));
//5.使用GenericApplicationContext和GroovyBeanDefinitionReader结合使用
GenericApplicationContext context4 = new GenericApplicationContext();
new GroovyBeanDefinitionReader(context4).loadBeanDefinitions("services.groovy", "daos.groovy");
context4.refresh();
}
}