Spring 容器
spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory的子接口,它们都代表Spring容器,
spring 容器是生产Bean实例的工厂,并管理容器中的Bean。
1.BeanFactory
BeanFactory 的常用实现类是DefaultListableBeanFactory,下面是简单的使用:
public class SpringContainer {
public static void main(String[] args) {
Resource rs = new ClassPathResource("bean.xml");
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
//加载xml
new XmlBeanDefinitionReader(beanFactory).loadBeanDefinitions(rs);
Driver driver = beanFactory.getBean("driver",Driver.class);
driver.driverCar();
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"
>
<bean id="driver" class="com.huan.spring.bean.Driver">
<constructor-arg ref="car"/>
</bean>
<bean id="car" class="com.huan.spring.bean.Car"/>
</beans>
Driver类和Car类:
public class Driver {
private Car car;
public Driver(Car car) {
this.car = car;
}
public void driverCar() {
System.err.println(car.carName());
}
}
public class Car {
public String carName() {
return "this is Jeep";
}
}
2.ApplicationContext
大多数情况下都是使用applicationContext作为spring容器,它拥有Beanfactory的所有功能且拥有额外的功能:
如:默认情况下会预初始化所有的singleton Bean、继承MessageSource接口提供国际化、事件机制、
同时加载多个配置文件等
修改代码验证预初始化:
public class Driver {
private Car car;
public Driver(Car car) {
System.out.println("=====构造器设值===="+car);
this.car = car;
}
public void driverCar() {
System.err.println(car.carName());
}
}
public class Car {
public Car(){
System.out.println("=========预初始化car======");
}
public String carName() {
return "this is Jeep";
}
}
package com.huan.spring.base;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import com.huan.spring.bean.Driver;
public class SpringContainer {
public static void main(String[] args) {
//userBeanFactory();
userApplicationContext();
}
private static void userApplicationContext() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
}
private static void userBeanFactory() {
Resource rs = new ClassPathResource("bean.xml");
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
//加载xml
new XmlBeanDefinitionReader(beanFactory).loadBeanDefinitions(rs);
Driver driver = beanFactory.getBean("driver",Driver.class);
driver.driverCar();
}
}
SpringContainer 中创建ApplicationContext成功后并没有获取Bean
可见使用ApplicationContext创建容器后会调用无参构造并注入依赖,而使用Beanfactory在不获取Bean的情况下是不会
进行调用无参构造以及注入依赖的
如果需要阻止Spring容器初始化容器中的singleton Bean,可以在<bean>中设置属性lazy-init="true"
3.ApplicationContext事件机制
ApplicationContext的事件机制主要ApplicationEvent类和ApplicationListener接口实现
- ApplicationEvent:容器事件,必须由ApplicationContext发布
- ApplicationListener:监听器,可有任何监听器Bean担任
public class EmailEvent extends ApplicationEvent{
private String address;
private String text;
public EmailEvent(Object source) {
super(source);
}
public EmailEvent(Object source, String address, String text) {
super(source);
this.address = address;
this.text = text;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
public class EmailNotifier implements ApplicationListener<EmailEvent>{
@Override
public void onApplicationEvent(EmailEvent event) {
System.out.println("邮件地址:==="+event.getAddress());
System.out.println("邮件内容==="+event.getText());
}
}
public class EventTest {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
//创建event
EmailEvent emailEvent = new EmailEvent("test", "12333@qq.com", "test event");
ctx.publishEvent(emailEvent);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"
>
<bean id="driver" class="com.huan.spring.bean.Driver" >
<constructor-arg ref="car"/>
</bean>
<bean id="car" class="com.huan.spring.bean.Car"/>
<bean class="com.huan.spring.base.EmailNotifier"/>
</beans>
当然spring中也内置了一些事件,如RequestHandledEvent。
4.Bean如何获取Spring容器
获取spring容器可以实现BeanFactoryAware接口或者ApplicationContextAware接口
public class Book implements ApplicationContextAware {
private ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.ctx = applicationContext;
}
public void printCtx() {
System.out.println(ctx);
}
}
public class BookTest {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
Book book = ctx.getBean("book", Book.class);
System.out.println(ctx);
book.printCtx();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"
>
<bean id="driver" class="com.huan.spring.bean.Driver" >
<constructor-arg ref="car"/>
</bean>
<bean id="car" class="com.huan.spring.bean.Car"/>
<bean class="com.huan.spring.base.EmailNotifier"/>
<bean id="book" class="com.huan.spring.base.Book"/>
</beans>