它继承了应用上下文ApplicationContext ) BeanFactory接口,简单来说就是Spring的容器,Spring的更高级容器。 它可用于获取容器中的各种bean组件、注册监听事件以及加载资源文件等功能。
beanfactory:spring的底层接口,提供最简单的容器功能,只提供实例化对象或拥有对象的功能。
应用程序上下文内容:1.国际化消息源)! 资源国际化测试-
豆豆
bean id=’ message source ‘ class=’ org.spring framework.context.support.reloadableresourcebundlemessagesource ‘ propet
org/rj studio/spring/properties/messages是以org.rjstudio.spring.proerties包下的messages为主要名称的属性文件
messages _ en _ us.properties messages _ zh _ cn.properties messages _ zh _ hk.properties
2 .访问URL和文件ResourceLoader )等资源以及访问资源资源文件) properties等)的能力
applicationcontextacxt=newclasspathxmlapplicationcontext ‘/application context.XML );
通过虚拟路径访问classpath路径:用于存储编译文件如. class )的路径) )。
资源资源=acxt.get资源“class path : messages _ en _ cn.properties”)
使用绝对路径访问资源文件
资源资源=acxt.get资源“file : f :/test work/my spring/src/messages _ en _ cn.properties”)
使用相对路径读取资源文件
资源资源=acxt.get资源/messages _ en _ cn.properties );
3.APP应用程序的web层application context.XML 具有多个)继承关系,包括JDBC设置、hibernate.cfg.xml和包含所有Service和DAO基类的主文件
应用程序上下文-缓存. XML 包含hibernate配置的缓存策略) )。
应用程序上下文- JMX.XML JMX,调试hibernate缓存性能) ) ) ) ) ) ) )。
应用程序上下文- security.XML acegi安全性)
应用程序上下文- transaction.XML
moduleName-Service.xml
moduleName-dao.xml
豆豆
import resource=” application context-cache.XML ” /
/beans
4 .消息发送,响应机制applicationevent context事件机制是观察者设计模式的实现如果可以实现应用程序的容器具有应用程序监听器bean,则每当应用程序上下文发布应用程序事件时,应用程序监听器bean都会自动执行此操作
两个重要成员
ApplicationEvent类:容器事件必须由ApplicationContext公开;
ApplicationListener接口:容器中的任何侦听器Bean都可以担当的侦听器。
示例:
1.1 .定义容器事件emaileventextendsapplicationevent
1.2 .定义侦听器的电子邮件通知
rListener implements ApplicationListener(容器事件的监听器类必须实现ApplicationListener接口)
1.3. 将监听器注入到spring容器
1.4. 测试:
public class SpringTest {
public static void mainString arg[]){ //读取Spring容器的配置文件 @SuppressWarnings”resource”) ApplicationContext applicationContext=new ClassPathXmlApplicationContext”application.xml”); //创建一个事件对象 EmailEvent emailEvent = new EmailEvent”hello Spring!”, “cxg@126.com”, “This is SpringApplicatoinContext test!”); //主动触发事件监视机制 applicationContext.publishEventemailEvent); }
}
5. AOP(拦截器)
一般拦截器都是实现HandlerInterceptor,其中有三个方法preHandle、postHandle、afterCompletion
preHandle:执行controller之前执行postHandle:执行完controller,return modelAndView之前执行,主要操作modelAndView的值afterCompletion:controller返回后执行
例:
1.1 注册拦截器,并且确定拦截器拦截哪些URL
< bean id=“validateSystemUserSessionInterceptor” class=“com.cherrypicks.appsdollar.cms.interceptor.ValidateSystemUserSessionInterceptor” />
<!– Interceptors –> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path=”/**” /> <mvc:exclude-mapping path=”/login” /> <mvc:exclude-mapping path=”/logout” /> <!– 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 –> <ref bean=”validateSystemUserSessionInterceptor” /> </mvc:interceptor> </mvc:interceptors>
1.2. 定义拦截器实现类
public class ValidateSystemUserSessionInterceptor extends HandlerInterceptorAdapter {
private final Log logger = LogFactory.getLogthis.getClass)); @Autowired private CmsUserSessionService userSessionService; @Override public boolean preHandlefinal HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception { logger.debug”ValidateUserSessionInterceptor.preHandle run….”); final String userIdStr = request.getParameterConstants.USERID); final String sessionId = request.getParameterConstants.SESSIONID); if !StringUtils.isNotBlankuserIdStr) || !StringUtils.isNotBlanksessionId)) { throw new InvalidUserSessionException “Invalid user session. userId[” + userIdStr + “], sessionId[” + sessionId + “]”); } final Long userId = Long.parseLonguserIdStr); // validate userId and sessionId if !userSessionService.validateUserSessionuserId, sessionId)) { throw new InvalidUserSessionException “Invalid user session. userId[” + userId + “], sessionId[” + sessionId + “]”); } return true; }
1.3. 测试
public static void mainfinal String[] args) {
final String i = “a”; System.out.printlnStringUtils.isNotBlanki)); }
小结:
ApplicationContext在启动的时候就把所有的Bean全部实例化。它还可以为Bean配置lazy-init=true来让Bean延迟实例化;
延迟实例化的优点:(BeanFactory)
应用启动的时候占用资源很少;对资源要求较高的应用,比较有优势;
不延迟实例化的优点: (ApplicationContext)
所有的Bean在启动的时候都加载,系统运行的速度快;在启动的时候所有的Bean都加载了,我们就能在系统启动的时候,尽早的发现系统中的配置问题建议web应用,在启动的时候就把所有的Bean都加载了。(把费时的操作放到系统启动中完成)
SpringBoot中获取ApplicationContext的三种方式:
一、 直接使用Autowired注入
二、利用 spring4.3 的新特性
三、实现spring提供的接口 ApplicationContextAware