Spring简介

导读:本篇文章讲解 Spring简介,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1. spring组成

在这里插入图片描述
Struts 表示层 MVC
Spring 业务逻辑层 IOC(DI),AOP
Hibernate 持久化层(数据处理层) ORM(对象-关系映射)
Spring 框架本身功能很强大,我们平时做项目主要是使用 spring 的 IOC 与 AOP 完成业务层
功能.但 spring 其实提供了所有层功能实现.比如表示层,我们可以选择使用
springMVC,springMVC 完成的功能与 struts 一眼.比如开发持久化层也可以选择
springDAO,SpringDAO 的功能与 hibernate 类似.
表示层 SpringMVC
业务层 IOC,AOP, MVC(SpringMVC) ORM(SpringDAO)
持久化层 SpringDAO

SpringCore 这是 spring 的根基,其实这个 core 就是实现了 ioc(DI).不管你使用上面的那
个功能, SpringCore 必须使用.
SpringAOP spring 的面向方面编程.
SpringDAO 类似与 hibernate 的持久化层实现
SpringORM 当 spring 与 hibernate 整合时,需要使用此部分功能
SpringWebMVC 类似与 struts 的表示层实现.
SpringWeb 如果我们项目需要与 Struts 整合,我们需要使用 SpringWeb
SpringContext 如果项目需要与 EJB 重量级框架整合,需要使用SpringContext

2. IOC(控制反转)

IOC 是 Inverse Of Control 的简写,叫控制反转
第一代:自己创建,自己使用.客户端的主要目的是使用,但却好耗费很大的精力来创建.
第二代:工厂方法,工厂方法分离对象的创建与使用,工厂负责创建,客户端只负责使用.
第三代:对象内部只声明接口,不创建,由容器负责创建并赋值.
控制反转:控制就是控制权,反转就是反过来更改.原来不管是自己创建对象还是由工厂类创建对象,使用那个对象由应用程序决定.也就是说在程序运行前我们就知道是那个具体的实现类在运行.现在客户端中只声明接口,并没有实际的实现类.程序运行使用那个对象在 spring 配置文件中进行配置,控制权由应用程序转移给 spring 配置文件(spring 容器,IOC 容器),这叫控制反转.
区别:传统的程序运行前就知道那个具体的实现类在运行.现在,程序运行前并不知道那个具体类在运行,只有程序真正运行到对应代码时才知道是那个具体的运行类.
控制,指的控制权,使用哪个对象,不管是自己创建,还是去工厂领一个,以前项目,使用哪个对象由程序决定,控制权在应用程序手中。使用 spring 后,程序中并没有写明创建哪个对象,使用对象是由配置文件(容器)决定的,这就是控制反转。

3. DI(依赖注入)

IOC 与 DI 是从两个角度描述同一个事务.
DI 是 Dependency Injection 的简写,叫依赖注入
程序中定义接口,程序运行需要实现类,这个实现类不是在编译阶段决定的,而是在程序运行过程中由容器注入的,我们叫依赖注入。
传统应用程序在编译阶段就知道了程序的运行轨迹(使用哪个对象,运行哪个对象),使用容器后,在程序运行阶段时才知道使用哪个对象。
此处不再叙述与其他框架的整合(例如struts,hibernate等)

4. AOP(面向方面编程)

AOP 的全称是 Aspect-Oriented Programming,面向方面编程,面向切面编程。在我们编写应用程序时,好多辅助功能如打印日志,安全验证,事务处理的代码分散在应用程序的各个角落,与业务逻辑代码高度耦合,不利于程序开发维护扩展。面向方面编程也可以说面向某一特定问题的编程。我们使用代理模式,把这些方面代码抽取出来,单独解决,提高了程序的可维护性,可扩展性。使业务逻辑代码与这些方面代码解耦(分开),使业务逻辑组件安心做事。
4.1 代理模式
主题接口:一个
主题接口实现类:多个,又称为目标类 target。
代理类:一个。两个特点:实现主题接口,因为客户端使用主题接口获取对象;内部声明一个主题接口,因为她不完成具体业务逻辑,还需要具体实现类完成。
4.2 SPRINGAOP 的几种通知
before advice(前置通知)实现了org.springframework.aop.MethodBeforeAdvice 接口的 advice,称之为前置 advice,意思是在目标方法还没有执行之前,该 advice 先执行
after returning advice(后置通知)实现了org.springframework.aop.AfterReturningAdvice 接口的 advice,称之为后置advice,意思是在目标方法执行之后,该 advice 执行。
throws advice(异常通知)实现了 org.springframework.aop.ThrowsAdvice 接口的advice,称之为 exception advice(异常通知),该接口中没有定义任何方法,但是在
实现相应 ThrowsAdvice 的时候,方法必须遵循如下规则: void
afterThrowing([Method,args,target],ThrowableSubclass) 其中[]中的三个参数可以省略。可以根据要拦截的 Throwable 的不同类型,在同一个 ThrowsAdvice 中实现多个 AfterThrowing 方法。Spring 框架将会使用 Java 反射机制来调用这些方法。
around advice(环绕通知)实现了org.aopalliance.intercept.MethodInterceptor 接口的 advice,称为 around advice, 就是直接拦截整个方法,方法的调用由程序员决定。前面我们编写的advice 虽然可以在目标方法被调用前后被拦截,但是我们并不能控制目标方法的执行。比 如在目标方法没有执行之前,先做权限检查,如果有权限执行则执行目标方法,否则不执行目标方法。这需要使用环绕 advice
4.3事务处理
Spring 使用声明式事务,不需要修改源代码,在 spring 配置文件中配置即可.
在 biz 层添加事务.
第一:添加 transactionManager

<bean id="tm"
class="org.springframework.orm.hibernate3.HibernateTransactionMana
ger">
<property name="sessionFactory"
ref="sessionFactory"></property>
</bean>

第二:添加事务代理类

5. Spring 高级编程

5.1 使用注解完成自动装配
Spring2.0 以后,我们可以使用 annotation 完成(IOC)注入,甚至完成自动扫描装
配。这里又可以使用两种方式的注解,spring 提供的@Autowired 与 JavaSE 提供的
@Resource。
5.1.21使用@AUTOWIRED(自动绑定)
Spring 提供了@Autowired 注解可以在 Field 上和该 Field 所对应的 setter 方法上使用,来完成自动装配的工作。它会自动在 Spring 容器中查找匹配的类型(按类型自动装配)。@Autowired 为 spring 框架提供的注解,无法移植,这种方式不推荐使用。
Spring 又提供了@Qualifier 与@Autowired 结合使用,@Qualifier 可以限制注入的对象是 Spring 中具体哪个对象,当配置文件中有多个对象时,必须指定。
5.1.2启动 annotation 支持
Annotation 本身是不会工作的,要想让 Annotation 工作,必须要有处理器来解析Annotation。这里有两种添加解析器的方法。
方式一:项目代码:annotationAutowried1

<bean 
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostP
rocessor"></bean>

方式二:项目代码:annotationAutowried2

 <beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>
</beans>

根据类别自动装配

//spring注解,默认按类别查找,
@Autowired(required=true)
@Qualifier("ziyijiejie") //当配置文件有多个实现类时,必须指定
private Nvzhujue nvzhujue;

5.1.3使用@RESOURCE
Spring 还支持 Java 平台的公共注解@Resource。Java 平台的公共注解来自 JDK 中的javax.annotation.*包。@Resource 的作用相当于@Autowired,区别是@Autowired 按 byType(按类型)自动注入,而@Resource 默认按 byName(按名称)自动注入。@Resource 有两个属性比较重要,分别是 name 和 type,Spring 将@Resource 注解的 name 属性解析为 bean 的名字,而 type 属性则解析为 bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。
根据名称自动装配

<?xml version1.0encodingUTF8?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>
<context:component-scan base-package="com.wangwang"></context:componentscan>
</beans>

初始化和销毁 Bean :

@PostConstruct //实例化之后,容器调用init方法
public void init(){
System.out.println("正在初始化...");
}
@PreDestroy //销毁之前,被容器调用
public void destory(){
System.out.println("正在销毁...");
}

5.1.4使用自动扫描

<context:component-scan base-package="com.wangwang"></context:componentscan>

问题是打开了自动扫描,将指定的 classpath 中的组件都纳入 Spring 的管理了,它们在容器中如何来标识呢?因为我们还要使用标识来进行“注入”,所以必须对容器中的对象进行标识,这就需要使用使用 @Service(业务),@Controller(控制器), @Repository(仓库) ,@Component(组件)这几个注解来标识这些类了,他们只有语义上的区别,使用的时候没有任何区别。一般在 DAO 的类上标注@Repository,在业务逻辑类上标注@Service,在Struts 控制器上标注@Controller,当组件不好归类的时候标注@Component。 自动扫描的时候,看到有的组件使用了上面的Annotation,就将它纳入容器管理起来,在 Annotation上使用名称进行标识。
5.1.5自动扫描条件限制
1.1.3.2 自动扫描条件限制
如果我们指定的包中有些类不想被纳入 Spirng 容器,可以使用 context 命名空间中的context:include-filter 和context:excude-filter来进行过滤。该子节点提供属性type 和 expression,其中 type 表示过滤类型(包括:annotation、assignable、aspectj、regex、custom),expression 表示过滤条件。
在这里插入图片描述

<context:component-scan base-package="com.jinzhi"> 
<!-- 扫描使用@Service标注的类--> 
<context:include-filter type="annotation" 
expression="org.springframework.stereotype.Service"/> 
</context:component-scan>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96868.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!