- 当一个bean需要获取它所在spring容器的时候,实际上这种情况是很常见的,例如要输出国际化信息,发布事件等。
- bean可以通过实现BeanFactoryAware接口实现获取它所在的spring容器,BeanFactoryAware只有一个setBeanFactory方法,spring容器会检测容器所有的bean,如果发现有bean实现了BeanFactoryAware(当然这个类已经实现了setBeanFactory方法),它会把它所在的容器当作参数传给它。
- 下面是一个例子,具体讲解穿插在代码里边。
- 程序结构
-
package service; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import java.util.Locale; /** * Person类实现了ApplicationContextAware接口,spring会把它所在的容器当作参数给他的setApplicationContext * 方法 */ public class Person implements ApplicationContextAware { private ApplicationContext applicationContext; // 这个变量用来保存它所在的spring容器 @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } public void sayHi(String name){ System.out.println(applicationContext. getMessage("hello", new String[]{name}, Locale.getDefault(Locale.Category.FORMAT))); // 在获取了spring容器之后,这个bean就可以使用已经保存有它所在的spring容器来获取国际化资源文件 } }
package test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import service.Person; /** * 逻辑是这样的,程序会先把spring容器给Person类,然后在这里使用的时候,Person类已经有了 * sprig容器了,其他的就输出输出,没有什么了 */ public class SpringTest { public static void main(String []args){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml"); Person person = applicationContext.getBean("person", Person.class); person.sayHi("java"); } }
两个配置文件和前面的一样,就不多说了
<?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="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>message</value> </list> </property> </bean> <!--获取spring容器的bean在配置上和普通的bean是一样的--> <bean id="person" class="service.Person"/> </beans>
这是我看李刚编著的《轻量级javaEE企业应用实战(第五版)-Struts2+Spring5+Hibernate5/JAP2》后总结出来的。
Spring(4) Bean获取Spring容器
最新推荐文章于 2023-02-02 21:03:00 发布