spring中Aware接口-存在疑问
Spring中提供一些Aware相关接口,像是BeanFactoryAware、 ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,实现这些 Aware接口的Bean在被初始之后,可以取得一些相对应的资源,例如实现BeanFactoryAware的Bean在初始后,Spring容器将会注入BeanFactory的实例,而实现ApplicationContextAware的Bean,在Bean被初始后,将会被注入 ApplicationContext的实例等等。
这些接口只有一个set方法
例如:
ApplicationContextAware.java
public interface ApplicationContextAware { void setApplicationContext(ApplicationContext context); }
应用
public class HelloBean implements ApplicationContextAware { private ApplicationContext applicationContext; private String helloWord = "Hello!World!"; public void setApplicationContext(ApplicationContext context) { this.applicationContext = context; } public void setHelloWord(String helloWord) { this.helloWord = helloWord; } public String getHelloWord() { applicationContext.publishEvent( new PropertyGettedEvent("[" + helloWord + "] is getted")); return helloWord; } }
2、
Struts 2提供了Aware接口。Aware为"感知"的意思,实现了相关Aware接口的Action能够感知相应的资源。Struts在实例化一个Action实例时,如果发现它实现了相应的Aware接口,会把相应的资源通过Aware接口方法注射进去。这种方式也可以叫做注射方式(IoC方式)。
Servlet API中常用对象application、request、response、Session对应的Aware接口分别为ServletContextAware、ServletRequestAware、ServletResponseAware、SessionAware。例如,下面的Action实现了这4种接口,能够感知到这些对象。代码如下:
package com.helloweenvsfei.struts2.action; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import org.apache.struts2.interceptor.SessionAware; import org.apache.struts2.util.ServletContextAware; public class ServletAwareAction extends ActionSupport implements ServletRequestAware, ServletResponseAware, SessionAware, Servlet ContextAware { private ServletContext application; // Servlet上下文 private HttpServletRequest request; // request对象 private HttpServletResponse response; // response对象 private Map session; // session对象 public void setServletRequest(HttpServletRequest request) { // request的setter方法 this.request = request; } public void setServletResponse(HttpServletResponse response) { // request的setter方法 this.response = response; } public void setSession(Map sessionValues) { // session的setter方法 this.session = sessionValues; } public void setServletContext(ServletContext application) { // servletContext的setter方法 this.application = application; } public String execute() { // 主方法 String upload = application.getRealPath("upload"); // 使用application request.getRemoteAddr(); // 使用request response.getContentType(); // 使用response session.get("account"); // 使用Session return Action.SUCCESS; } }
实现了ServletRequestAware接口便会有一个setServletRequest()方法获取request对象。实现了ServletResponseAware接口便会有一个setServletResponse()方法获取response对象。不同的是SessionAware接口的setter方法是setSession()方法的参数是Map类型。该Map代表Session内存储的各种数据。
Aware接口其实是一种拦截器,拦截器代码会在执行Action之前执行,将相关的Servlet对象设置进来。
总结:Aware接口其实是一种拦截器,把一些所需对象进行set进来,有点类似与bean注入,但是不清楚有什么区别???
可能是因为有些对象是内置的在启动的时候创建,当运用时无法进行bean注入到另一使用对象中