Spring学习

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集合。


你可能感兴趣的:(Spring学习)