欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring容器

程序员文章站 2022-05-06 18:20:39
...

引言

         Spring容器是生成Bean实例的工厂,并管理容器中的Bean。

Spring容器

         Spring 容器最基本的接口就是BeanFactory。BeanFactory负责配置,创建、管理Bean,它有一个子接口:ApplictionContext,因此也被称为Spring上下文。Spring 容器还负责管理Bean与Bean 之间的依赖关系。

BeanFactory接口的基本方法

Spring容器

ApplictionContext

         Application Context 是BeanFactory 的子接口,因此功能更强大。对于大部分JavaEE应用而言,使用它作Spring容器更方便。其常用实现类FileSystemXmlApplicationContext ,ClassPathXrnlApplicationContext 和AnnotationConfigApplicationContext。如果在Web 应用中使用Spring 容器,则通常有XmlWebApplicationContext、AnnotationConfigWebApplicationContext 两个实现类。

使用ApplicationContext

创建Bean
public class Person
{
    public Person()
    {
        System.out.println("==正在执行Person无参数的构造器==");
    }
    public void setTest(String name)
    {
        System.out.println("正在调用setName()方法,传入参数为:" + name);
    }
}

配置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">
    <bean id="chinese" class="Person" >
        <!-- 驱动Spring执行chinese Bean的setTest()方法,以"孙悟空"为传入参数 -->
        <property name="test" value="孙悟空"/>
    </bean>
</beans>
在测试类创建容器

        // 创建Spring容器
       ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config.xml");
运行结果

Spring容器
怎么使用BeanFactory创建Spring容器呢

       // 搜索类加载路径下的beans.xml文件创建Resource对象
   ClassPathResource isr = new ClassPathResource("spring-config.xml");
	// 创建默认的BeanFactory容器
	DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
	// 让默认的BeanFactory容器加载默认的
    new XmlBeanDefinitionReader(beanFactory).loadBeanDefinitions(isr);

运行结果
Spring容器
我们看到用BeanFactory并没有预初始化容器中的Bean.

         为了阻止Spring 容器预初始化容器中的singleton Bean 可以这样做<bean id="chinese" class="Person" lazy-init="true"/>该属性用于阻止容器预初始化该Bean

ApplicationContext的国际化支持

Spring容器

<?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
	<bean id="messageSource"
	class="org.springframework.context.support.ResourceBundleMessageSource">
		<!-- 驱动Spring调用messageSource Bean的setBasenames()方法,
			该方法需要一个数组参数,使用list元素配置多个数组元素 -->
		<property name="basenames">
			<list>
				<value>message</value>
				<!-- 如果有多个资源文件,全部列在此处 -->
			</list>
		</property>
	</bean>
</beans>

Spring容器

1
hello=欢迎你,{0}
now=现在时间是:{0}

2
hello=welcome,{0}
now=now is :{0}
3
hello=\u6b22\u8fce\u4f60\uff0c{0}
now=\u73b0\u5728\u65f6\u95f4\u662f\uff1a{0}
TestSpring
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.*;

public class SpringTest
{
	public static void main(String[] args)throws Exception
	{
		// 实例化ApplicationContext
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		// 使用getMessage()获取本地话信息
		// Locale的getDefault方法返回计算机环境的默认Locale
		String hello = ctx.getMessage("hello" , new String[]{"孙悟空"}
			, Locale.getDefault(Locale.Category.FORMAT));
		String now = ctx.getMessage("now" , new Object[]{new Date()}
			, Locale.getDefault(Locale.Category.FORMAT));
		// 打印两条信息
		System.out.println(hello);
		System.out.println(now);
	}
}

ApplicationContext的事件机制

Spring容器
Spring容器

实例

创建事件

import org.springframework.context.ApplicationEvent;
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;
    }

    // address的setter和getter方法
    public void setAddress(String address)
    {
        this.address = address;
    }
    public String getAddress()
    {
        return this.address;
    }

    // text的setter和getter方法
    public void setText(String text)
    {
        this.text = text;
    }
    public String getText()
    {
        return this.text;
    }
}

创建监听器


import org.springframework.context.ApplicationListener;
import org.springframework.context.ApplicationEvent;


public class EmailNotifier implements ApplicationListener{
    // 该方法会在容器发生事件时自动触发
    @Override
    public void onApplicationEvent(ApplicationEvent evt) {

        // 只处理EmailEvent,模拟发送email通知...
        if (evt instanceof EmailEvent)
        {
            EmailEvent emailEvent = (EmailEvent)evt;
            System.out.println("需要发送邮件的接收地址  "
                    + emailEvent.getAddress());
            System.out.println("需要发送邮件的邮件正文  "
                    + emailEvent.getText());
        }
        else
        {
            // 其他事件不作任何处理
            System.out.println("其他事件:" + evt);
        }
    }
}

配置文件

<?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 class="EmailNotifier"/>
</beans>

测试类

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class SpringTest
{
    public static void main(String[] args)
    {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config.xml");
        // 创建一个ApplicationEvent对象
        EmailEvent ele = new EmailEvent("test" ,
                "aaa@qq.com" , "this is a test");
        // 发布容器事件
        ctx.publishEvent(ele);
    }
}

运行结果
Spring容器

内置事件

Spring容器

相关标签: Spring