Spring实战(前言:Spring容器)

  Spring容器,顾名思义是用来容纳东西的,装的就是Bean。Spring容器负责创建、配置、管理Bean。spring容器有两个核心接口:BeanFactory和ApplicationContext接口,后者是前者的子接口。在基于spring的Java EE程序中,所有的组件都被当成Bean来处理,包括数据源对象、hibernate的sessionFactory、事务管理等,程序中的所有Java类都可以被当成spring容器中的bean。
  
  1、spring容器
  
  spring容器的核心接口是BeanFactory,它有一个子接口就是ApplicationContext。ApplicationContext也被称为spring上下文。
  
  调用者只需要使用getBean()方法即可获得指定bean的引用。对于大部分的Java程序而言,使用ApplicationContext作为spring容易更为方便。其常用的实现类有FileSystemXmlApplicationContext、ClassPathXmlApplicationContext和AnnotationConfigXmlApplicationContext。如果Java web中使用spring容器,则通常有XmlWebApplicationContext、AnnotationConfigWebApplicationContext两个容器。
  
  创建spring容器的实例时,必须提供spring容器管理的bean的配置文件,也就是我们常说的spring.xml配置文件。因此在创建beanFactory时配置文件作为参数传入。xml配置文件一般以resource对象传入。resource是spring提供的资源访问接口,通过该接口spring更简单、透明的访问磁盘,网络系统和类路径上的相关资源。
  
  对于独立的Java EE应用程序,可以通过如下方法来实例化BeanFactory。
  
  //在当前项目类路径下搜索配置文件
  
  ApplicationContext appContext = new ClassPathXmlApplicationContext("beans_7_3_3.xml");
  
  //在文件系统搜索配置文件
  
  appContext = new FileSystemXmlApplicationContext("D:\\spring-tool-workspace\\myspring\\src\\beans_7_3_3.xml");
  
  //获取chinese的Bean,并且返回的类型为Chinese
  
  Person chinese = appContext.getBean("chinese", Chinese.class);
  
  chinese.useAxe();
  
  2、使用ApplicationContext
  
  大部分时间,都不会使用beanFactory实例作为spring容器,而是使用ApplicationContext作为spring容器,因此spring容器也被称为spring上下文。ApplicationContext增强了beanFactory的功能,提供了很多有用、方便开发的功能。
  
  在web中可以利用如contextLoader的支持类,在web应用启动的时候自动创建ApplicationContext。
  
  除了提供beanFactory所支持的全部功能外,application还额外的提供如下功能:
  
  ① ApplicationContext会默认初始化所有的singleton bean(单例bean),也可以通过配置取消。
  
  ② ApplicationContext继承了messageSource接口,因此提供国际化支持。
  
  ③ 资源访问,比如URL和文件。
  
  ④ 事件机制。
  
  ⑤ 同时加载多个配置文件。
  
  ⑥ 以声明式方式启动并创建spring容器。
  
  ApplicationContext包括beanFactory的所有功能,并提供了一些额外的功能,优先使用ApplicationContext。对于在内存消耗的才使用beanFactory。
  
  当系统创建ApplicationContext容器时,会默认初始化singleton bean,包括调用构造器创建该bean的实例,通过元素驱动spring调用setting方法注入所依赖的对象。这就意味着,系统前期创建ApplicationContext会有很大的开销,但是一旦初始化完成后面获取bean实例就会拥有较好的性能。为了阻止在使用ApplicationContext作为spring容器初始化singleton bean可以在元素添加lazy-init="true"属性。
  
  3、ApplicationContext的国际化支持
  
  ApplicationContext接口继承了MessageSource接口,因此具备国际化功能。
  
  //MessageSource接口提供的国际化的两个方法
  
  String getMessage(String code, Object [] args, Locale loc){
  
  }
  
  String getMessage(String code, Object[]args, String default, Locale loc){
  
  }
  
  spring国际化的支持,其实是建立在Java国际化的基础上的。其核心思路将程序中需要国际化的消息写入资源文件,而代码中仅仅使用国际化信息响应的key。
  
  4、ApplicationContext的事件机制
  
  ApplicationContext的事件机制是观察者设计模式的实现。通过ApplicationEvent和ApplicationListener接口实现,前者是被观察者,后者是观察者。
  
  spring事件框架有两个核心的接口:
  
  ApplicationEvent(事件):必须由ApplicationContext来发布。
  
  ApplicationListener(监听器):实现了此接口就可以担任容器中的监听器bean。
  
  实际上,spring的事件机制是由事件(实现ApplicationEvent接口的类)、事件源(也就是spring容器,并且有Java代码显示的触发)、监听器(ApplicationListener接口实现类)。这就像我们在页面点击一个button。button是事件源,单机的这个动作就是事件,处理函数就是监听器。
  
  以下代码演示spring事件机制:
  
  import org.springframework.context.ApplicationEvent;
  
  public class EmailEvent extends ApplicationEvent{
  
  private String address;
  
  private String text;
  
  public EmailEvent(Object source) {
  
  super(source);
  
  }
  
  public EmailEvent(Object source, String address, String text) {
  
  super(source);
  
  this.address = address;
  
  this.text = text;
  
  }
  
  public String getAddress() {
  
  return address;
  
  }
  
  public void setAddress(String address) {
  
  this.address = address;
  
  http://www.senta7.net/content/?729.html
  
  public String getText(www.yacuangyl.com) {
  
  return text;
  
  }
  
  public void setText(String text) {
  
  this.text = text;
  
  }
  
  }
  
  import org.springframework.context.ApplicationContext;
  
  import org.springframework.context.ApplicationEvent;
  
  import org.springframework.context.ApplicationListener;
  
  import org.springframework.context.support.ClassPathXmlApplicationContext;
  
  public class EmailNotifier implements ApplicationListener {
  
  @Override
  
  public void onApplicationEvent(ApplicationEvent event) {
  
  //处理email事件
  
  if(event instanceof www.xcdeyiju.com EmailEvent){
  
  EmailEvent email = (EmailEvent) event;
  
  System.out.println(email.getAddress()+" "+email.getText());
  
  }else {
  
  //输出spring容器的内置事件
  
  System.out.println("其它事件:"+event);
  
  }
  
  }
  
  public static void main(String[] args) {
  
  ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans_7_4_4.xml");
  
  EmailEvent emailEvent = applicationContext.getBean("emailEvent",EmailEvent.class);
  
  applicationContext.publishEvent(emailEvent);
  
  }
  
  }
  
  <?xml version="1.0" encoding="UTF-8"?>
  
  <beans xmlns="http://www.jujinyule.com .org/schema/beans"
  
  xmlns:xsi="http://www.yuchengyulegw.com 2001/XMLSchema-instance"
  
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.hnawesm.com org/schema/beans/spring-beans.xsd">
  
  <bean class="EmailNotifier"></bean>
  
  <bean id="emailEvent" class="EmailEvent">
  
  <constructor-arg value="test"></constructor-arg>
  
  <constructor-arg value="123@qq.com"></constructor-arg>
  
  <constructor-arg value="this is a test">www.seocelve.com</constructor-arg>
  
  </bean>
  
  </beans>
  
  从上面的代码可以看出,事件监听器不仅监听到了我们程序显示触发的事件,还监听了spring容器内置的事件。如果实际开发需要,我们可以在spring容器初始化或销毁时回调自定义方法,就可以通过上面的事件监听机制来完成。
  
  spring提供了如下几个内置对象:
  
  ContextRefreshedEvent、ContextStartedEvent、ContextClosedEvent、ContextStoppedEvent、RequestHandledEvent。
  
  5、让bean获取spring容器
  
  上面都是通过ApplicationContext创建spring容器,再调用spring容器的getBean()方法获取bean。这种情况下,程序总是持有spring容器的引用。但是在web应用中,我们可以用声明式的方法来创建spring容器:在web.xml文件中配置一个监听,让这个监听类帮我们来创建spring容器,前端MVC框架直接调用bean,使用依赖注入功能,无需访问spring容器本身。
  
  在某些特殊情况下,bean需要实现某个功能(比如:bean需要输出国际化信息,或向spring容器发布事件),这些功能都需要借助spring容器来完成。就是说我们需要将spring容器作为一个bean来注入到其它bean中,只不过spring容器bean是一个容器级别的bean。
  
  为了让bean获取它所在容器的引用,可以让bean实现beanFactoryAware接口。该接口只有一个方法setBeanFactory(BeanFactory beanFactory)方法,方法的beanFactory参数指向spring容器,会由spring容器注入。我们bean中定义一个setter方法后,通常都是由在配置文件中配置元素来驱动spring容器来注入依赖bean的,但是这里我们并没有这样做,这是因为一个bean如果实现了beanFactory接口,spring在创建该bean时,会自动注入spring容器本身。与beanFactoryAware接口类似的还有BeanNameAware、ResourceLoaderAware接口,这些接口都会提供类似的setter方法,这些方法会由spring容器来注入。
  
  下面我们来演示一个示例,这个示例中的Person类中的sayHi()方法将输出国际化消息,这就需要Person获取Spring容器,借助Spring容器来完成国际化。
  
  <?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="messagSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  
  <property name="basenames">
  
  <list>
  
  <value>messages/message</value>
  
  </list>
  
  </property>
  
  </bean>
  
  <bean id="person" class="com.container.Person">
  
  </bean>
  
  </beans>
  
  package com.container;
  
  import org.springframework.beans.BeansException;
  
  import org.springframework.context.ApplicationContext;
  
  import org.springframework.context.ApplicationContextAware;
  
  import org.springframework.context.support.ClassPathXmlApplicationContext;
  
  import java.util.Locale;
  
  public class Person implements ApplicationContextAware{
  
  private ApplicationContext applicationContext;
  
  @Override
  
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  
  this.applicationContext = applicationContext;
  
  }
  
  public void sayHello(String name){
  
  Locale locale = Locale.getDefault(Locale.Category.FORMAT);
  
  String myName = applicationContext.getMessage("name",new String[]{name},Locale.US);
  
  System.out.println(myName);
  
  }
  
  public static void main(String[] args) {
  
  System.out.println(Person.class.getClassLoader().getResource(".").getPath());
  
  ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans_7_4_5.xml");
  
  Person p = applicationContext.getBean("person",Person.class);
  
  p.sayHello("江疏影");
  
  }
  
  }
  
  message_zh_CN.properties国际化资源文件
  
  name=CH \u4F60\u597D,{0}
  
  message_en_US.properties国际化资源文件

转载于:https://www.cnblogs.com/qwangxiao/p/11325322.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

具有WildFly,Arquillian,Jenkins和OpenShift的Java EE 7部署管道

技术提示&#xff03;54展示了如何Arquillianate&#xff08;Arquillianize&#xff1f;&#xff09;一个现有的Java EE项目并在WildFly在已知主机和端口上运行的远程模式下运行这些测试。 技术提示&#xff03;55展示了当WildFly在OpenShift中运行时如何运行这些测试。 这两个…

《那些年啊,那些事——一个程序员的奋斗史》——88

谁也不知道武总脑袋里面会想些什么。这天早上段伏枥还在发愁如何改进这4.3机器的电源管理的时候&#xff0c;武总突然让自己到会议室开会。 段伏枥还没坐下来的时候&#xff0c;武总推过来一台机器&#xff0c;说:“你看看&#xff0c;这机器怎么样。” 段伏枥定睛一看&#xf…

css浮动(float)及清除浮动的几种实用方法

CSS浮动是现在网页布局中使用最频繁的效果之一,而浮动可以帮我们解决很多问题,那么就让我们一起来看一看如何使用浮动. 一.css浮动(float) (1)html文档流 自窗体自上而下分成一行一行&#xff0c;并在每行中按从左到右的顺序排放元素。 (2)网页中大部分对象默认是占用文档流…

一台电脑同时添加git和bitbucket两个网站的ssh key

添加第一个ssh key 就不多说了&#xff0c;不懂的可以自己查资料 ssh-keygen -t rsa -C email_1email.com 然后一路enter就好了 假设已经添加好了git的ssh key 。现在要添加bitbucket的ssh key 首先 ssh-keygen -t rsa -C email_2email.com //同一个邮箱也可以 然后指定公钥的…

属性提取器:获取ListView即时更新其元素的最佳方法

这篇文章是关于如何处理JavaFX ListViews和TableViews的&#xff0c;以及这些控件如何得知所包含元素的更改内容。 我想知道为什么在相关书籍中没有找到关于以下模式的任何信息&#xff0c;因为这是一个非常关键的机制。 那里的许多帖子建议通过调用以下命令来强制触发ChangeEv…

基于python语言下的UI自动化测试框架搭建(四)

testsuits:案例执行 创建baidu_search1.py文件&#xff0c;这里会展示两种执行方式&#xff0c;一种是直接调用base_page中封装好的常用操作方法&#xff0c;另外一种是先调用baidu_homepage.py&#xff0c;通过baidu_homepage.py进行处理&#xff0c;再执行对应的案例&#xf…

MVC详解

模型&#xff0d;视图&#xff0d;控制器&#xff08;Modal View Controler&#xff0c;MVC&#xff09;是Xerox PARC在八十年代为编程语言Smalltalk&#xff0d;80发明的一种软件设计模式&#xff0c;至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式&#xff0c…

如何为每个URL连接设置自定义SSLSocketFactory的TrustManager

从javadoc中我们可以看到javax.net.ssl.HttpsURLConnection提供了一个静态方法来用setDefaultSSLSocketFory&#xff08;&#xff09;方法覆盖。 这样&#xff0c;您就可以提供一个自定义javax.net.ssl.TrustManager&#xff0c;它可以验证您自己的CA证书握手和验证等。但是&am…

ES6之命令妙用

很多人都听说过ES6&#xff08;也就是ECMAScript的新一代标准&#xff09;并且对她充满了向往&#xff0c;下面通过一个ES6中小知识点——let命令&#xff0c;来解开她的神秘面纱&#xff0c;让大家初步认识一下ES6的语法规范。let命令属于ES6中的一个基本语法&#xff0c;与原…

VUE-搜索过滤器

先看看效果 首先引入 <script src"https://cdn.jsdelivr.net/npm/vue"></script> HTML部分 <div id"app"><input v-modelsearch /><ul v-if"searchData.length > 0"><li v-for"item in searchData&quo…

使用spring-session外部化Spring-boot应用程序的会话状态

Spring-session是一个非常酷的新项目&#xff0c;旨在提供一种更简单的方法来管理基于Java的Web应用程序中的会话。 我最近在spring-session中探索的功能之一是它支持外部化会话状态的方式&#xff0c;而无需费心诸如Tomcat或Jetty之类的特定Web容器的内部。 为了测试spring-s…

windows2008 sp2 x64安装 ocs 2007 r2 笔记

在写这篇日志之前&#xff0c;反反复复安装了N次&#xff0c;重装操作系统好几次&#xff0c;为了让大家不再犯同样的错误&#xff0c;特留下几点要注意的&#xff1a; 1. 不要用windows2008 r2 装 ocs 2007 r2&#xff0c; 我很天真的下载了windows2008 r2 并开始装 ocs r2&am…

JS(JQEERY) 获取JSON对象中的KEY VALUE

var json { "Type": "Coding", "Height":100 };for (var key in json){alert(key); alert(json[key]);}$.each(json, function(i) {alert(json[i]);alert(i); }); 转载于:https://www.cnblogs.com/ytjjyy/archive/2012/04/17/2453340.html

vue 特定条件下绑定事件

今天写了个小功能&#xff0c;看起来挺简单&#xff0c;写的过程中发现了些坑。1.div没有disabled的属性&#xff0c;所以得写成button2.disabled在data时&#xff0c;默认是true&#xff0c;使得初始化时&#xff0c;默认置灰按钮&#xff0c;无法点击 <div classform-item…

使用纯HTML和OmniFaces构建动态响应的多级菜单

最近&#xff0c;我不得不使用JSF 2.2创建一个响应式多级菜单。 要求&#xff1a;菜单应&#xff1a; 从后端使用动态结构创建 反应灵敏&#xff0c;例如对桌面和移动设备友好 有带有导航链接的子菜单项 支持触摸事件 支持键盘辅助功能 PrimeFaces的菜单不是一个选择。 实…

Jquery 日历控件

非常好的Jquery日历控件 http://keith-wood.name/datepick.html 转载于:https://www.cnblogs.com/hubj/archive/2011/04/28/2031791.html

poj 3041

题目链接&#xff1a;http://poj.org/problem?id3041 没看题&#xff0c;网上搜最大二分匹配搜到的 匈牙利算法&#xff0c;深搜一次最多增加一个匹配 代码&#xff1a; #include <stdio.h> #include <stdlib.h> int tu[505][505]; int mx[505],my[505]; int flag…

使用JAX-RS(Jersey)的HTTP状态错误消息响应中的自定义原因短语

在最近的一些工作中&#xff0c;我收到了在发生错误时在HTTP状态响应中生成自定义“原因短语”的请求&#xff0c;该状态短语传递给我们的一个REST API消耗客户端。 在这篇文章中&#xff0c;我将演示如何使用Jersey来实现。 1.定义检查的异常和异常映射器 正如您可能从我的文…

hdu 1251 统计难题(求前缀出现了多少次)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1251 #include <iostream> #include <cstring> #include <cstdio> #define mem(a,b) memset(a,b,sizeof(a)); using namespace std; typedef long long ll; const int maxn 500005; const l…

新浪微博后台服务器架构

http://www.slideshare.net/iso1600/high-performance-weibo-qcon-beijing-2011-7577912High Performance Weibo QCon Beijing 2011 View more presentations from Tim Y 转载于:https://www.cnblogs.com/inteliot/archive/2012/04/19/2457008.html