1、Spring是什么?
Spring是大工厂,所有的java对象都可由它来产生,它是所有对象的工厂,超级工厂。
对Spring来说一切都是bean。
即便构造器私有(用private修饰),Spring依然可以创建bean的实例。
使用方法:
1.导入spring-framework-3.1.0.RELEASE\dist 中的全部Jar包,(另外common-logging jar 包必须导入)
2.增加一个Spring配置文件,随便取个名字beans.xml放在src目录下
3.获取Spring容器(Spring工厂),在通过工厂去获取他们的产品。
//在spring中,我们可以先创建spring容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
UserDao userDao = ctx.getBean("userDao", UserDao.class);
userDao.save(name, pass);
2、Spring的控制反转(IOC Inverse of control)和 依赖注入(DI Dependency Injection)
(1)依赖:
A组件需要调用B组件的方法——称A组件依赖B组件
传统模式: A组件主动创建B组件,B组件升级A组件也必须修改。
工厂模式: A组件主动调用B组件的工厂去获取B组件,B组件升级,只要修改B组件的工厂,A组件不用修改。
Spring模式:A组件只要为B组件提供一个Setter方法即可,然后再Spring配置文件中配置即可
A组件就可以被动的接受Spring提供的B组件。(IOC)
Spring把A所依赖的B组件注入到A组件中。 (DI)
(2)注入的方法:
A、设值(Setter)注入: 用<property .../>驱动调用一次setter方法。
B、构造(Constructor-arg)注入: 用<constructor-arg .../>驱动调用有参的构造器。
注意:当constructor-arg 省略type属性时,该参数值value优先被当成string处理。
================================BeanFactory 和 ApplicationContext的区别:=================================
//BeanFactory 会延迟初始化所有bean,即:创建Spring容器时,不会创建容器中的Bean.
BeanFactory bf = new XmlBeanFactory(new ClassPathResources("beans.xml"));
//ApplicationContext 会预初始化容器中的single Bean。即:创建Spring容器时,会立即创建容器中的single Bean.
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
ApplicationContext 比BeanFactory多如下功能:
(1)国际化支持
(2)支持资源(来自磁盘,网络,IO流,Web应用的文件或数据)访问
(3)加载多个配置文件
(4)事件支持
=================================功能1、国际化============================================================
ApplicationContext继承MessageSource接口,因此提供国际化支持。MessageSource接口中定义的三个用于国际化的方法:
String getMessage(String code, Object[] args, Locale loc)
String getMessage(String code, Object[] args, String default, Locale loc)
String getMessage(MessageSourceResolvable resolvable,Locale Locale)
其中,code表示是properties文件的key。
args是properties文件中的占位符{0},{1}...
loc:可以取值Locale.CHINA; Locale.US; 也可以根据操作系统类型来Locale.getDefault();
在使用国际化方法之前,我们要在容器中配置一个名为messageSource,类型为ResourceBundleMessageSource的Bean用于管理国际化资源文件。
<!-- 该bean加载国际化资源文件 -->
<bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>mess</value>
</list>
</property>
</bean>
说明
上面的<list>标签表示这个一个数组,里面的value有多个。
我们在src目录下定义mess_en_US.properties 和 mess_zh_CN.properties两个properties文件。
其中,mess为basename; en表示语言; US表示国家
调用如下:
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"beans.xml", "fk_beans.xml");
//Application的国际化就是通过getMessage()的方法来实现的
System.out.println(ctx.getMessage("hello", new String[]{ "孙悟空" },
Locale.CHINA));
System.out.println(ctx.getMessage("hello", new String[]{ "猪八戒"},
Locale.US));
System.out.println(ctx.getMessage("logTitle", new String[]{ "孙悟空" ,"第一名"},
Locale.getDefault()));
System.out.println(ctx.getMessage("logTitle", new String[]{ "猪八戒","第二名"},
Locale.getDefault()));
=======================================功能二、加载资源==============================================================
/*加载资源
* 告诉spring从指定的路径加载资源
* 1.classpath:从类加载路径加载
* 2.ftp: 从网络加载,基于FTP协议
* 3.http:从网络加载,基于HTTP协议
*/
Resource res = ctx.getResource("classpath:abc.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(res.getInputStream()));
String line = null;
while((line = br.readLine())!= null)
{
System.out.println(line);
}
======================================功能三、加载多个配置文件=============================================================
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"beans.xml", "fk_beans.xml");
=====为bean添加别名===
可以使用<alias……/>元素来为一个已经存在的Bean实例指定别名,该元素可以指定2个属性:
name:该属性指定一个Bean实例的标识名,表明将为该Bean实例指定别名。
alias:指定一个别名
====Bean的作用域===
singleton:单例,所有从Spring容器中取出的总是同一个实例。Spring默认采用该模式。
当ApplicationContext初始化时,容器会自动初始化所有的singleton Bean
每次程序向spring容器请求时,spring容器总是返回最开始创建的singleton Bean。
prototype:不会预初始化。每次通过Springle容器中获取实例,Spring都会new一个新的实例返回。
每次向程序请求时,spring容器会临时去创建prototype Bean。
request:对应web应用中的request作用域。
要在web应用才有效,每个用户请求,spring创建一个bean实例。
session:对应web应用中的session作用域。
要在web应用才有效,每个用户会话,spring都只创建一个Bean实例。
global session:仅在使用portlet context的时候才有效
无论是<property……/> (调用setter方法)还是 <constructor-arg……/> (有参构造参数)
==============需要传入各种类型的实参=======================
1.基本类型及其包装类、String、Date等标量类型。用value属性或者value子元素传入值。
2、自定义的类。需要用ref或者Bean传入值。
3、list、set、数组、Map集合。