1、什么是Spring
Spring是一个开源的轻量级的应用开发框架,目的是为了简化企业级编程。
Spring 提供了IOC和AOP的功能,能够管理各个bean对象之间的关系,可以将组建的耦合度降低,便于日后的维护和升级,实现各个模块的组件化编程。
2、Spring容器
Spring容器相当于创建Bean的抽象工厂。
在Spring中,任何的Java和JavaBean都被当成Bean处理,这是bean都交给Spring容器管理和使用。
3、如何创建Spring容器
Spring容器有BeanFactory和ApplicationContext两种类型,ApplicationContext继承自BeanFactory接口,拥有更多的企业级方法。本质上来讲,BeanFactory和ApplicationContext仅仅是维护bean组件的高级工厂接口。
实例化方法如下:
/**
* applicationContext.xml Spring容器管理bean的配置文件
*/
String conf = "applicationContext.xml";
ApplicationContext ac = newClassPathXmlApplicationContext(conf);
可以把conf配置文件放在src源文件夹下,也可以放在一个指定的包中。
4、Spring容器的使用
通过ApplicationContext的对象ac我们可以获取在Applicationbean.xml中配置好的Bean。
首先,我们要在容器中添加已创建的bean,把我们的对象交给容器去管理。Bean的定义方式:
package pers.zky.entity;
import java.io.Serializable;
/**
* @author Zky
* 创建一个Book 类的Bean
*/
public class Book implements Serializable{
private String id;
private String name;
public Book() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后在application中添加bean:
<bean id="book" class="pers.zky.entity.Book"></bean>
接下来由ac对象调用getBean()方法获取Bean实例:
Student stu = ac.getBean("student",Student.class);
当然,自定义的bean可以交给Spring管理,Java自带的类也可以交给Spring管理。
xml:
<bean id="cal" class="java.util.Calendar" factory-method="getInstance"></bean>
java:
Calendar c = ac.getBean("cal",Calendar.class);
5、使用Spring创建bean的方式
1)、通过构造器实例化bean
2)、通过静态工厂方法实例化bean
3)、通过实例工厂方法实例化bean
6、Spring容器中bean的作用域
在application.xml中,修改bean的scope属性,用来指明bean的作用域。
1)、sington 单例模式
在整个Spring容器中,使用singleton定义的Bean将只有一个实例。
XML:
<bean id="student" class="pers.zky.entity.Student" scope="singleton"></bean>
java:
Student stu1 = ac.getBean("student",Student.class);
Student stu2 = ac.getBean("student",Student.class);
System.out.println(stu1==stu2);
Console:
true
2)、prototype 原型模式
通过静态工厂方法实例化bean
XML:
<bean id="student" class="pers.zky.entity.Student" scope="prototype"></bean>
java:
Student stu1 = ac.getBean("student",Student.class);
Student stu2 = ac.getBean("student",Student.class);
System.out.println(stu1==stu2);
Console:
false
3)、request
在一次http请求中,一个bean定义对应一个实例,仅限于web环境。
4)、session
在一次http session中,一个bean定义对应一个实例,仅限于web环境。
5)、global session
在一个全局的http session中,一个bean定义对应一个实例,仅限于web环境。仅在基于portlet的web应用中才有意义,Portlet规范定义了全局session的概念。
7、Spring容器中bean的生命周期
指定销毁方法,必须是Singleton模式的bean;并且容器的接受者要变为AbstractApplicationContext才有close方法。
xml:
<bean id="example" class="com.tz.entity.ExampleBean" init-method="init" destroy-method="destroy" lazy-init="true"></bean>
java:
package pers.zky.entity;
import java.io.Serializable;
/**
* ExampleBean类,测试生命周期
* */
public class ExampleBean implements Serializable{
public ExampleBean() {
System.out.println("无参构造");
}
public void init(){
System.out.println("初始化");
}
public void service(){
System.out.println("执行");
}
public void destroy(){
System.out.println("销毁");
}
}
console:
无参构造
初始化
执行
销毁