spring的ApplicationContext,事件监听器与国际化消息

ApplicationContext

spring中的对象实例课通过ApplicationContext获得。

通过下面代码获得对象实例(必须先通过xml文件定义)
如下面例子

//主函数
public class StudentExample {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("BeanConfig-lab2.xml");
        StudentBean student=(StudentBean)context.getBean("studentbean");
    }
}

//StudentBean类
public class StudentBean {

    private String name;
    private int age;

    public void init()
    {
        this.age=18;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}
//xml配置文件
<beans>
//init-method可指定对象的初始化方法
<bean id="studentbean" class="com.cst.spring.lab2.StudentBean" init-method="init">
        //这里的name与setName对应
        <property name="name">
            <value>tom</value>
        </property>
    </bean>
</beans>

关于bean的配置不仅限与上述配置,还有许多高级配置,比如。
需实例对象中对另外的对象有依赖。

ref beaf="xxx"

表示引用一个id或name,这个bean可以在同一
个xml文件中,也可以不在当前xml文件中;不在同一文件中,使用
import来引入其他配置文件;

ref local="xxx"

表示引用当前xml 的bean

<bean class="java.unit.Date">

使用内部Bean,不需要id,只能在此处使用
对于数组、List、Set、Map等集合对象,在注入前必须填充入一些对象至集合中,然后将集合对象注入到所需的Bean,也可以由IoC容器来完成集合对象的注入;

对于数组或List类型的依赖注入,在定义文件中使用标签;对于Map类型,使用标签,但要用表示key。对于Set类型,使用标签;

若要注入的是properties类型,使用标签

事件监听器

在Spring应用程序执行期间,ApplicationContext本身就会发布一连串的事件,这些事件都是抽象类ApplicationEvent的子类,如果对事件感兴趣,实现接口ApplicationListener,并在定义文件中定义实现该接口的一个Bean实例。

如下面实现ApplicationListener接口的一个类用于监控学生年龄:

public class AgeListener implements ApplicationListener{

    public void onApplicationEvent(ApplicationEvent arg0) {
        // TODO Auto-generated method stub
        if(arg0 instanceof AgeEvent) {
            AgeEvent age=(AgeEvent)arg0;
            StudentBean student=age.getStudent();
            if(student.getAge()<16||student.getAge()>21)
            {
                System.out.println("学生年龄不在有效范围");
            }
            else
                System.out.println("监听器已启用,年龄在有效范围");
        }
    }

}

再实现一个事件类AppliationEvent

public class AgeEvent extends ApplicationEvent{

    private StudentBean student;

    public AgeEvent(StudentBean student) {
        super(student);
        // TODO Auto-generated constructor stub
        this.student=student;
    }

    public StudentBean getStudent()
    {
        return this.student;
    }
}

在主函数内发布事件

public class StudentExample {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("BeanConfig-lab2.xml");
        StudentBean student=(StudentBean)context.getBean("studentbean");
        context.publishEvent(new AgeEvent(student));
    }
}

国际化消息

ApplicationContext继承接口org.springframework.context.MessageSource接口,使用getMessage()获得文字消息,从而实现国际化消息的目的。

如下:

//先在属性文件msg_en_US.properties和msg_zh_CN.properties定义国际化资源

studentinfo=this student name is {0}  and age is {1}
//中文编码
studentinfo=\u8FD9\u4E2A\u5B66\u751F\u7684\u540D\u5B57\u662F {0}  \u5E74\u9F84\u662F {1}

//在配置文件中实现bean
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="msg"/>
</bean>

//主函数中定义输出
public class StudentExample {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("BeanConfig-lab2.xml");
        StudentBean student=(StudentBean)context.getBean("studentbean");

        //为属性文件中的{0},{1}提供值
        Object[] obj=new Object[]{student.getName(),String.valueOf(student.getAge())};

    //输出国际化消息   System.out.println(context.getMessage("studentinfo",obj,Locale.CHINA));
    System.out.println(context.getMessage("studentinfo",obj,Locale.US));
    }
}

以上便是本文的全部内容,有什么问题请指正。谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值