Spring是一个开源的轻量级的应用开发框架,其目的是用于简化企业级应用程序开发,降低侵入性
Spring提供的IOC和AOP功能,可以将组件的耦合度降至最低,即解耦,便于系统的维护和升级
Spring为系统提供了一个整体的解决方案,开发者可以利用它本身提供的功能也可以与第三方框架和技术整合应用,可以自由选择
为什么要用Spring
Spring框架的本质是管理软件中的对象,即创建对象和维护对象之间的关系
Spring主要功能:IOC,AOP,DAO,ORM,JEE,WEB
2.Spring容器
在Spring中,任何的Java类和JavaBean都被当成Bean处理,Bean对象通过容器管理和使用
Spring容器实现了IOC和AOP机制,这些机制可以简化Bean对象创建和Bean对象之间的解耦
Spring容器有BeanFactory和ApplicationContext两种类型;
何时使用Spring
当需要管理JavaBean对象时候就可以使用,Spring是最简洁的对象管理方案
Spring容器的实例化
ApplicationContext继承自BeanFactory接口,拥有更多的企业级方法,推荐使用此类型,实例化方法如下:
//加载工程classpath下的配置文件实例化
String msgXml="applicationContext.xml";
ApplicationContext ac=new ClassPathXmlApplicationContext(msgXml);
从本质上讲,BeanFactory和ApplicationContext仅仅只是一个维护Bean定义以及相互依赖关系的高级工厂接口,通过BeanFactory和ApplicationContext我们可以访问bean定义
首先在容器配置文件applicationContext.xml中添加Bean定义
<bean id="标识符" class="Bean类型"/>
然后在创建BeanFactory和ApplicationContext容器对象后,调用getBean()方法获取Bean的实例即可
getBean("标识符");
Bean的实例化
用构造器实例化
<bean id="calendar" class="java.util.GregorianCalendar"/>
id或name属性用于指定Bean的名称,用于从Spring容器中查找Bean对象
class属性用于指定Bean的类型,会自动调用无参构造器创建对象
使用静态工厂方法实例化
<bean id="calendar" class="java.util.Calendar" factory-method="getInstance"/>
factory-method属性用于指定工厂中创建Bean对象的方法,必须用static修饰的方法
使用实例工厂方法实例化
<bean id="calendar" class="java.util.GregorianCalendar"/>
<bean id="time" factory-bean="calendar" factory-method="getTime"/>
factory-bean属性用于指定工厂Bean对象
3.Bean的作用域
Spring容器在实例化Bean时,可以创建以下作用域的Bean对象
singleton:在每个Spring IOC容器中一个Bean定义对应一个对象实例,默认项
prototype:一个Bean定义对应多个对象实例
request:在一次HTTP请求中,一个Bean定义对应一个实例,仅限于WEB环境
session:在一个HTTP Session中,一个Bean定义 对应一个实例,仅限于WEB环境
global session:在一个全局的HTTP Session中,一个Bean定义对应一个实例
可以通过<bean/>定义的scope属性来指定
如下图代码 我们测试了bean的 实例化和作用域:
import java.util.Calendar;
import java.util.Date;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestCase {
//实例化Spring容器
@Test
public void testOne(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(ac);
}
//实例化Bean方式
@Test
public void testTwo(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
Calendar c1=(Calendar) ac.getBean("gregorianCalendar");
System.out.println(c1);
Calendar c2=ac.getBean("calendar",Calendar.class);
System.out.println(c2);
Date date=ac.getBean("time",Date.class);
System.out.println(date);
System s1=(System) ac.getBean("system");
System.out.println(s1);
}
//Bean的作用域
@Test
public void testThree(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
//实例化Bean对象
//==================singleton=======================================
Calendar c1=(Calendar) ac.getBean("gregorianCalendarOne");
Calendar c2=(Calendar) ac.getBean("gregorianCalendarOne");
System.out.println(c1==c2);
//===================prototype===========================================
Calendar c3=ac.getBean("gregorianCalendarTwo",Calendar.class);
Calendar c4=ac.getBean("gregorianCalendarTwo",Calendar.class);
System.out.println(c3==c4);
}
}
另外在容器配置文件applicationContext.xml中添加Bean定义
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
<!-- 通过构造器实例化Bean -->
<bean id="gregorianCalendar" class="java.util.GregorianCalendar"/>
<!-- 通过静态工厂方法实例化Bean -->
<bean id="calendar" class="java.util.Calendar" factory-method="getInstance"/>
<!-- 通过实例工厂方法实例化Bean -->
<bean id="time" factory-bean="gregorianCalendar" factory-method="getTime"/>
<bean id="system" class="java.lang.System"/>
<!-- Bean的作用域 -->
<bean id="gregorianCalendarOne" class="java.util.GregorianCalendar" scope="singleton"/>
<bean id="gregorianCalendarTwo" class="java.util.GregorianCalendar" scope="prototype"/>
</beans>
4.Bean的生命周期
指定初始化回调方法
<bean id="" class="" init-method=""/>
指定销毁回调方法,仅适用于singleton模式的Bean
<bean id="" class="" destroy-method=""/>
在顶级的<beans>元素中的default-init-method属性,可以为容器中全部<bean>指定初始化回调方法
在顶级的<beans>元素中的default-destroy-method属性,可以为容器中全部<bean>指定销毁回调方法
Bean延迟实例化
在ApplicationContext实现的默认行为就是在启动时将全部singleton bean提前进行实例化,如果不想让一个singleton bean在ApplicationContext初始化时,被提前实例化,可以使用<bean>元素的
lazy-init="true" 属性改变
一个延迟初始化bean将在第一次被用到时实例化
<bean id="" class="" lazy-init="true"/>
在顶级的<beans>元素中的default-lazy-init属性可以为容器中全部<bean>指定延迟实例化特性
关于Bean的生命周期大家可以自己创建一个bean进行测试 以上代码需要引用5个Spring基础jar包可以在这里下载