一、 什么是Spring?
Spring是一个开源框架,Spring是于 2003年兴起的一个轻量级的Java开发框架,为了解决企业级开发的复杂性而创建的。
Spring设计理念 是面向Bean的编程
Spring 有两个核心技术:控制反转(IOC : Inversion of Control)/依赖注入(DI :Dependency Injection) 面向切面编程:(AOP: Aspect Oriented Programming)
- Spring的优点:
低侵入式设计
独立于个大应用服务器
依赖注入的特性将组件关系透明化,降低耦合度
面向切面编程的特性允许将通用的任务进行集中式处理
能与第三方框架良好的整合
开源免费容器
控制反转(IOC DI依赖注入) 、面向页面编程(AOP)
对事物的支持(声明式事务)
方便解耦,简化开发(高内聚低耦合)
2.控制反转(IOC)/依赖注入(DI)
将组件对象的控制权 从代码本身转移到外部容器组件化的思想:分离关注点,使用接口,不再关注实现
依赖注入:将组件的构建和使用分开
二、IOC容器:
Spring 容器是Spring的框架核心,容器创建对象,把它们连接在一起,配置他们,管理他们的整个生命周期(从创建到销毁)
Spring容器使用依赖注入(DI)来管理组成一个应用程序的组件这些对象被称为(Spring Beans)
总结:核心容器提供Spring框架的基本功能,核心容器主要组件是BeanFactory,他是工厂模式的实现BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性与实际的应用程序代码分来
控制反转:依赖于容器给予资源,控制权坐落在容器身上,不主动new实例化对象,而需要那个对象,变向容器发请求,让容器帮我们创建一个对象出来。
依赖注入:所需要的对象,需要依赖容器注入本质上IOC和DI是同一思想下的不同维度的表现
代码案例:`
<!-- 将Student 类交给Spring管理 (面向Bean编程) -->
<!-- id:不能重名 class: 需要转换的类的路径.类名-->
<bean id="student_a" class="com.xk.pojo.Student" >
<!-- 使用 set访问器 注入“张三”到 student_a对象中 -->
<property name="stuName" value="张三"/>
<property name="sex" value="男"></property>
</bean>
<!--使用 构造函数注入数据 index:构造函数的参数下标 value:设置普通值 ref :另一个bean-->
<bean id="student_b" class="com.xk.pojo.Student">
<constructor-arg index="0" value="李四"></constructor-arg>
<constructor-arg index="1" value="女"></constructor-arg>
</bean>
<bean id="entity" class="com.xk.pojo.TestEntity">
<!-- type: 表示参数的类型 -->
<property name="specialCharacter1" >
<value type="java.lang.String"><![CDATA[P&C]]> </value>
</property>
<property name="specialCharacter2">
<value>P&G</value>
</property>
<!--注入对象方式一 : 创建对应的Bean 比如student_b-->
<!--注入对象方式二:内部Bean-->
<property name="student" >
<bean class="com.xk.pojo.Student">
<property name="sex" value="女"></property>
<property name="stuName" value="Mr. lnner"></property>
</bean>
</property>
<property name="list">
<list>
<!-- 定义List中的元素-->
<value>足球</value>
<value>篮球</value>
</list>
</property>
<property name="array">
<list>
<!-- 定义数组中的元素-->
<value>足球</value>
<value>篮球</value>
</list>
</property>
<property name="set">
<set>
<!-- 定义SET中的元素-->
<value>足球</value>
<value>篮球</value>
</set>
</property>
<property name="map">
<map>
<entry>
<key>
<value>football</value>
</key>
<value>足球</value>
</entry>
<entry>
<key>
<value>basketball</value>
</key>
<value>篮球</value>
</entry>
</map>
</property>
<property name="props">
<props>
<prop key="football">足球</prop>
<prop key="basketball">篮球</prop>
</props>
</property>
<!--注入 空 null "" -->
<property name="emptyValue">
<value></value>
</property>
<property name="nullValue">
<null/>
</property>
</bean>
<!--使用P命名空间注入属性值-->
<!--1、在xml头部 配置 :xmlns:p="http://www.springframework.org/schema/p"-->
<bean id="student_c" class="com.xk.pojo.Student" p:stuName="王五" p:sex="男">
</bean>
<!--注入对象方式三:p命名空间注入-->
<bean id="testEntity" class="com.xk.pojo.TestEntity" p:student-ref="student_c"></bean>
`
作用域 | 描述 |
---|---|
singleton | 在Spring IOC容器仅存在一个Bean实例,Bean以单例方式存在 默认值 |
prototype | 每次从容器中调用Bean是,都返回一个新的实例,每次在调用getBean()时,相当于执行了new xxxxBean(); |
request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 |
session | 用一个HTTP Session共享一个Bean,不同Session使用不同Bean,仅适用于WebApplicationContext环境 |
global-session | 一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext环境 |
三、什么是AOP?
AOP(Aspect Oriented Programming) :面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP是OOP(面向对象)的延续,是软件开发中的一个热点,也是Spring框架的一个重要内容,势函数式编程的一种衍生泛型。
利用AOP可以对业务逻辑各个部分进行隔离,从而使的业务逻辑各个部分之间的耦合度降低,提高程序的重用性,同时提高开发效率。
1、AOP采取横向抽取机制,取代了传统的纵向继承体系 重复性代码
2、经典应用:事务管理、性能监视、安全检查、缓存、日志等等…
3、Spring Aop 使用纯Java实现,补充需要专门的编译过程和类加载器,在运行期间通过代理方式向目标类 注入 增强代码
4、AspectJ是一个基于Java语言的AOP框架,Spring 2.0开始 Spring AOP引入对Aspect 的支持,Aspect扩展了Java语言,提供一个专门的编译器,在编译时提供横向代码的织入.
1、目标类(target) , 需要被代理的类 例如 UserService
2、连接点(JoinPoint):是指那些可能被拦截的方法,例如 addUser 。。。。。
3、切入点(PointCut) 已经被增强的连接点 例如:addUser…….
4、通知/增强(advice) :增强代码 前置增强 后置增强 环绕增强 异常增强 最终增强
5、织入(Weaving) 是指把增强 advice 应用到目标对象target来创建新的代理对象Proxy的过程
6、代理类(Proxy)
7、Aspect(切面) 是切入点PointCut和通知advice的结合