什么是Spring:

Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架
分层:
SUN提供的EE的三层结构:web层、业务层、数据访问层(持久层,集成层)
Spring框架有对三层的每层解决方案:
web层:Spring MVC.
持久层:JDBC Template.
业务层:Spring的Bean管理。

Spring的核心:
IOC:(Inverse of Control 反转控制)
AOP:Aspect Oriented Programming 是面向对象的功能延伸.不是替换面向对象,是用来解决OOP中一些问题。

Spring优点:
方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
AOP编程的支持。
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
声明式事务的支持。
只需要通过配置就可以完成对事务的管理,而无需手动编程方便程序的测试。
Spring对Junit4支持,可以通过注解方便的测试Spring程序,方便集成各种优秀框架。
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz(定时器)等)的直接支持,降低JavaEE API的使用难度。
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。

Spring体系结构

Spring 框架是一个分层架构,它包含一系列的功能要素并被分为大约20个模块。这些模块分为Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和测试部分,如下图所示:

spring是什么层 spring有哪几层_AOP

IOC装配Bean:

Spring框架Bean实例化的方式:
无参数构造方法的实例化:

<bean id="bean1" class="com.baidu.spring3.demo2.Bean1"></bean>

静态工厂实例化:

<bean id="bean2" class="com.baidu.spring3.demo2.Bean2Factory" factory-method="getBean2"></bean>

实例工厂实例化:

<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
<bean id="bean3Factory" class="com.baidu.spring3.demo2.Bean3Factory"/>

Bean的命名 id属性和name属性:
一般情况下,装配一个Bean时,通过指定一个id属性作为Bean的名称;
id 属性在IoC容器中必须是唯一的;
id 的命名要满足XML对ID属性命名规范;
必须以字母开始,可以使用字母、数字、连字符、下划线、句号、冒号;
如果Bean的名称中含有特殊字符,就需要使用name属性;
例如:

<bean name="#person" class="com.baidu.pojo.Person"/>

因为name属性可以相同,所以后出现Bean会覆盖之前出现的同名的Bean

Bean的生命周期的11个步骤:
1.instantiate bean对象实例化
2.populate properties 封装属性
3.如果Bean实现BeanNameAware 执行 setBeanName
4.如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext
5.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization(注意配置到核心配置文件中)
6.如果Bean实现InitializingBean 执行 afterPropertiesSet
7.调用 指定初始化方法 init
8.如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization
9.执行业务处理
10.如果Bean实现 DisposableBean 执行 destroy
11.调用 指定销毁方法 customerDestroy

Bean中属性注入:
构造器注入:

<bean id="car" class="com.baidu.spring3.demo5.Car">
		<!-- <constructor-arg name="name" value="宝马"/>
		<constructor-arg name="price" value="1000000"/> -->
		<constructor-arg index="0" type="java.lang.String" value="奔驰"/>
		<constructor-arg index="1" type="java.lang.Double" value="2000000"/>
	</bean>

setter方法注入:

<bean id="car2" class="com.baidu.spring3.demo5.Car2">
		<!-- <property>标签中name就是属性名称,value是普通属性的值,ref:引用其他的对象 -->
		<property name="name" value="保时捷"/>
		<property name="price" value="5000000"/>
	</bean>