某个类的属性在每次构建对象时传入,且属性不是固定的,就没法使用spring管理它。但这个类有可能应用其他被spring管理的类。

那么既然是web工程,我们可以创建一个ServletContextListener,然后在web.xml中配置该监听器即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class InitDataListener implements ServletContextListener {  
      
    @Override  
    public void contextDestroyed(ServletContextEvent event) {  
        
    }  
  
    @Override  
    public void contextInitialized(ServletContextEvent event) {  
        ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());
		SpringUtil.setContext(context);
    }  
}

SpringUtil:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class SpringUtil {
    private static ApplicationContext context;
    public static void setContext(ApplicationContext _context) {
	    context = _context;
    }
    public static Object getBean(String beanName) {		
        if (context != null) {
            return context.getBean(beanName);
        } else {
            return null;
        }
    }
    public static <T> T getBean(Class<T> tClass) {
        if (context != null) {
            return context.getBean(tClass);
        }
        return null;
    }
}

web.xml:

1
2
3
<listener>
    <listener-class>com.tommy.myapp.listener.InitDataListener</listener-class>
</listener>

然后其他工程中可以通过SpringUtil.getBean()来获取spring管理的bean。

当然了,你用一个Servlet也是可以的,继承HttpServlet,在init()中获取ApplicationContext,注意在web.xml中配置该servlet。

这里可能的应用场景包括:
1.在系统启动时查询一些数据放入内存等等;–也可以使用@PostConstruct注解,在对象初始化后执行。
2.在非Spring管理的类中应用Spring管理的类。