Spring是一个基于IOC和AOP的结构J2EE系统的框架
IOC 反转控制 是Spring的基础,Inversion Of Control
简单说就是创建对象由以前的程序员自己new 构造方法来调用,变成了交由Spring创建对象
DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可。
(1)spring是一个容器框架,他将我们需要使用的service,dao放在里面,我们需要使用的时候就可以直接取出来,不用每次都去new,如果每次都去new,每次都会生成一个新的对象。spring是一个大工厂,专门负责创建bean
(2)spring支持声明式的事务,只需要通过配置就可以完成对事务的管理,无需手动编程。
(3)spring方便很多框架的集成
Spring 框架是一个分层架构,它包含一系列的功能要素并被分为大约20个模块。这些模块分为Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和测试部分,如下图所示:

Spring的核心jar包:
spring-core-3.2.2.RELEASE.jar
包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心。
spring-beans-3.2.2.RELEASE.jar
所有应用都要用到的,它包含访问配置文件、创建和管理bean
以及进行Inversion of Control(IoC) / Dependency Injection(DI)操作相关的所有类
spring-context-3.2.2.RELEASE.jar
Spring提供在基础IoC功能上的扩展服务,此外还提供许多企业级服务的支持,
如邮件服务、任务调度、JNDI定位、EJB集成、远程访问、缓存以及各种视图层框架的封装等。
spring-expression-3.2.2.RELEASE.jar
Spring表达式语言
com.springsource.org.apache.commons.logging-1.1.1.jar
第三方的主要用于处理日志
装配bean 的三种方式
<!-- spring内部创建对象的原理:
1:解析xml文件,获取类名,id,属性
2:通过反射,用类创建对象
3:给创建的对象赋值
-->
<!--装配bean的三种方式-->
<!--第一种方式:new实现类-->
<bean id="userService" class="com.yejj.service.IUserServiceImpl"></bean>
<!--第二种方式:通过静态工厂方法,在加载容器创建userService时会自动调用factory-method-->
<bean id="userService2" class="com.yejj.service.UserServiceFactory" factory-method="createUserservice"></bean>
<!--第三种方式:通过实例工厂方法-->
<bean id="factory3" class="com.yejj.service.UserServiceFactory2"></bean>
<bean id="userService3" factory-bean="factory3" factory-method="createUserservice"></bean>
从spring容器中获取service,spring加载容器有三种方式
/** 第一种方式:ClassPathXmlApplicationContext
* 使用类路径加载,从class文件中读取(常用方法)
* 及时加载,调用 new ClassPathXmlApplicationContext就会创建对象,创建对象时默认调用无参构造函数
* ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
**/
/**
* 第二种方式:文件系统路径加载
* ApplicationContext applicationContext = new FileSystemXmlApplicationContext("F:\\ideaProject\\springStudy\\src\\beans.xmlbeans.xml");
*/
/**
* 第三种方式:使用beanfactory(已废弃方法)延时加载,使用getbean才会创建对象
* BeanFactory factory = new XmlBeanFactory(new FileSystemXmlApplicationContext(""))
*/
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
IUserService iuser = (IUserService) applicationContext.getBean("userService");
iuser.add();
bean的作用域
常用的两种:
singleton 在Spring IoC容器中仅存在一个Bean实例,Bean以单例方式存在,默认值
prototype 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new XxxBean()
使用singleton还是不使用呢
Beans被定义为两种部署模式中的一种:singleton或non-singleton。(后一种也别叫作prototype,尽管这个名词用的不精确因为它并不是非常适合)。如果一个bean是singleton的,那么仅有一个共享的这个bean的实例被管理,所有id或者ids与这个bean定义匹配的beans请求都会导致那个唯一特定的bean实例被返回。
而non-singleton,prototype模式的bean部署产生的后果是:对这个bean的每次请求都会创建一个新的bean实例。这对于例如每个user需要一个独立的user对象这样的情况是非常理想的。
Beans默认被部署为singleton模式,除非你指定为另外的。要紧记把类型变为non-singletion(prototype)后,每一次对这个bean的请求都会导致一个新创建的bean而且这可能并不是你真正想要的。所以仅仅在绝对需要的时候才把模式改成prototype的。
在下面这个例子中,两个bean一个被定义为singleton的而另一个被定义为non-singleton(prototype)的。exampleBean会在客户端每次向BeanFactory请求它的时候被创建,而yetAnotherExample仅仅被创建一次;在对它每次请求的时候这个实例的引用会被返回。
注意:当部署一个bean为prototype模式时,这个bean的生命周期就会有稍许改变。通过定义,Spring无法再管理一个non-singleton/prototype bean的整个生命周期,因为当它创建之后,它被交给客户端而且容器根本不再留意它了。当说起non-singleton/prototype bean的时候,你可以把Spring的角色想象成“new”操作符的替代品。从那之后的任何生命周期方面的事情都由客户端来处理。
bean的生命周期

生命周期图解释
1.instantiate bean对象实例化
2.populate properties 封装属性
3.如果Bean实现BeanNameAware接口 执行 setBeanName为bean设置name
4.如果Bean实现BeanFactoryAware 执行setBeanFactory ,获取Spring容器把对 象放进容器/工厂。
5.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization
6.如果Bean实现InitializingBean 执行 afterPropertiesSet,属性赋值完成之后执行此方法
7.调用 调用用户自定义初始化方法 init
8.如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization
-------执行业务处理-----------
9.如果Bean实现 DisposableBean 执行 destroy
101.调用 指定销毁方法 customerDestroy
Bean的完整生命周期所用到的组件大概可以分为以下几类:
1、Bean级别的接口
Bean自身定义的方法或者实现了接口的方法,即init-method和destroy-method指定的方法,还有实现了BeanNameAware,BeanFactoryAware,InitializingBean,DiposableBean等接口的方法。
2、容器全局后处理器接口
包括了BeanFactoryPostProcessor,InstantiationAwareBeanPostProcessor,BeanPostProcessor这两个接口,它们是容器全局级别的接口。
参数注入
构造方法注入
<!--构造方法注入属性值-->
<!-- <bean id="stu" class="action.student" scope="singleton">
<!–相当于调用 public student(String name, String pass)构造方法–>
<constructor-arg name="name" value="yejj"></constructor-arg>
<constructor-arg name="pass" value="password"></constructor-arg>
</bean>-->
<bean id="stu" class="action.student" scope="singleton">
<!--通过索引+type的方式注入 public student(String name, String pass)index指构造方法参数中的位置 -->
<constructor-arg index="0" value="yejj" type="java.lang.String"></constructor-arg>
<constructor-arg index="1" value="password" type="java.lang.String"></constructor-arg>
</bean>
属性setter方法注入(常用方式)
<bean id="userService" class="com.yejj.service.IUserServiceImpl" scope="singleton">
<!--依赖注入,调用对象的set方法将属性注入对象,动态将依赖对象注入bean中-->
<property name="name" value="zhangsan"></property>
</bean>
通过P命名空间注入

SPEL表达式
Spring 表达式
对进行统一编程,所有的内容都使用value
#{123}、#{‘jack’} : 数字、字符串
#{beanId} :另一个bean引用
#{beanId.propName} :操作数据
#{beanId.toString()} :执行方法
#{T(类).字段|方法} :静态方法或字段
集合注入
集合的注入都是给添加子标签
数组:<array>
List:<list>
Set:<set>
Map:<map> ,map存放k/v 键值对,使用<entry>描述
Properties:<props> <prop key=""></prop>
普通数据:<value>
引用数据:<ref>

154

被折叠的 条评论
为什么被折叠?



