Spring详细讲解.docx
- 文档编号:3938544
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:16
- 大小:23.67KB
Spring详细讲解.docx
《Spring详细讲解.docx》由会员分享,可在线阅读,更多相关《Spring详细讲解.docx(16页珍藏版)》请在冰豆网上搜索。
Spring详细讲解
Spring
Spring是一个开源的控制反转(InversionofControl,IOC)和面向切面(AOP)的容器框架,它的主要目的是简化企业开发。
名词解释:
一、控制反转:
是指应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。
这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转
二、依赖注入:
在运行期,由外部容器动态地将依赖对象注入到组件中。
三、轻量级与重量级:
划分一个应用属于轻量级还是重量级,主要看它使用了多少服务,使用服务越多,容器要为java对象做的工作就越多,必然会影响到应用的发布时间或运行性能。
Spring容器提供了很多服务,但这些服务默认是关闭的,当应用需要某种服务的时候,还需要之名将使用该服务,spring默认只使用了spring的核心服务,所以是轻量级的,如果应用使用了spring的大部分服务,则为重量级的。
spring的好处:
一、降低组件之间的耦合度,实现软件各层之间的解耦。
二、可以使用容器提供的众多服务,如:
事务管理服务、消息服务等。
当我们使用容器管理事务时,开发人员就不再需要手工控制事务,也不需处理复杂的事务传播。
三、容器提供单例模式支持,开发人员不再需要自己编写实现代码。
四、容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
五、容器提供众多辅助类,使用这些类能够加快应用的开发,如:
JdbcTemplate、HibernateTemplate
六、Spring对主流应用框架提供了集成支持,如:
集成Hibernate、JPA、Struts等便于应用开发。
Spring开发所需的jar文件:
一、必须
a)spring.jar
b)commons-logging.jar
二、使用切面编程(AOP)所需的jar
a)Aspectjweaver.jar
b)Aspectjrt.jar
c)Cglib-nodep-2.1_3.jar
三、使用JSR-250中的注解(如:
@Resource/@PostConstruct/@PreDestroy),所需的jar
a)Commons-annotations.jar
Spring的使用:
将业务类交给Spring容器管理和维护(通过配置文件中的bean标签来配置)
使用业务类时就可以从Spring容器中获取业务类对象
Spring的使用步骤:
一、向项目中添加jar包,并创建配置文件
a)Bean标签中的id:
为bean在spring中起了个名字,该名字是唯一的,不能由特殊字符,专属XML,可以由XML解析器校验
b)Bean标签中的name:
同样为bean在spring中起个名字,但它可以由特殊字符
二、创建业务类
三、将业务类交给spring容器来管理和维护
四、从spring容器中获得业务类对象,进行操作
a)创建spring容器对象
i.(ApplicationContextctx=newClassPathXmlApplicationContext(“配置文件的名字”))<读取配置文件,并创建对象>
b)从spring容器中获得业务对象
i.ctx.getBean(“配置文件中bean的名字”)
Spring中实例化Bean的三种方式:
一、使用类构造器实例化
二、使用静态工厂方法实例化
//创建工厂类
PublicclassOrderServiceFactory{
PublicstaticOrderServiceBeancreateOrder(){
ReturnnewOrderServiceBean();
}
}
三、使用实例工厂方法实例化
//创建工厂类
PublicclassOrderServiceFactory{
PublicOrderServiceBeancreateOrder(){
ReturnnewOrderServiceBean();
}
}
Bean的作用域
Bean的作用域在spring中有五种:
1、singleton:
Spring中默认的作用域为sigleton既每次从Spring容器中获得的对象是同一个
2、prototype:
每次从Spring容器中获得的对象都是新对象
3、request
4、session
5、globalSession
Bean的生命周期:
Bean在默认作用域中,当容器创建就被创建,若作用域设置为prototype则在通过getBean方法获得对象时实例化,
Bean标签的属性:
一、属性
1、id为bean的名字
2、class那个类创建的实例
3、scope:
作用域
4、lazy-init:
是否进行懒加载初始化,若进行了懒加载初始化则在容器初始化时不创建实例
5、init-method:
容器创建类实例时执行的初始化方法(用于初始化资源)
6、destroy-method:
对象销毁时执行的方法(用于销毁资源)
7、autowire:
设置该bean的属性为自动装配,它会将该bean的所有属性进行装配
二、子标签(property)
实现依赖注入的标签
属性:
1、name-:
表示将要注入给那个属性
2、ref:
指定将谁注入到name属性
常用方法:
ApplicationContext:
3、getBean()--------------获得bean对象
AbstractApplicationContext:
1、close()--------------关闭容器
Sping的依赖注入方式:
1、构造器注入(通过构造方法注入)
--构造方法注入-->
--构造器中第一个参数,类型是UserDao类型-->
--构造器中第二个参数,类型是String类型-->
2、Setter注入(通过set方法注入)(使用property标签完成)
a)Property注入:
(将userDao对象注入到userBiz对象的userDao属性中,userDao属性是UserDao接口类型,可以在任何地方使用userDaobean对象)
b)使用内部bean注入:
(使用内部bean注入只能在本bean中使用内部bean对象)
c)为基本类型注入:
d)集合注入:
i.Set集合
ii.List集合
iii.Properties集合
iv.Map集合
3、使用注解的方式注入依赖对象。
(2.0以后提供,就是在类的属性或方法中注入)
使用注解方式注入:
1、在xml中加入命名空间:
//www.springframework.org/schema/beans" xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance" xmlns: context=http: //www.springframework.org/schema/context —命名空间- xsi: schemaLocation="http: //www.springframework.org/schema/beans http: //www.springframework.org/schema/context《 --schema文件--> http: //www.springframework.org/schema/context/spring-context-2.5.xsdhttp: //www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 2、打开注解的配置。 注册对多个注解进行解析处理的处理器: AutowiredAnnotationBeanPostProcessor(解析@Autowired)、CommonAnnotationBeanPostProcessor(解析@Resource) annotation-config/> -打开注解的配置- 3、使用注解进行依赖注入, 在java中使用@Autowired(Spring提供)和@Resource(javaee提供,已经纳入jdk1.6中)都可以将依赖对象注入,区别: @Autowired默认按类型装配、@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。 @Resource的name属性可以指定依赖对象的名称,如果找不到该名称则返回null,如果不设置name属性,则会按照默认的名称查找依赖对象,如果找不到则按类型装配 @Autowired、@Resource可以在属性上使用也可以在setter方法上使用。 @AutowiredprivatePersonDaopersonDao//字段上使用 @Resource(name=personDao) privatePersonDaopersonDao; @Autowired//setter方法上使用 PublicvoidsetPersonDao(PersonDaopersonDao){} @Autowired默认是按类型进行装配的,可以通过方法: @Autowired@Qualifier(“name”)将@Autowired改为按名称装配 @Autowired(required=true)表示必须给该属性注入值,如果没有注入则报异常 @Autowired(required=false)表示给该属性注入值是可选的,如果没有注入则会注入一个null 三、通过在classpath自动扫描方式把组件纳入spring容器中管理(2.5以后提供) 1、在xml中加入命名空间: //www.springframework.org/schema/beans" xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance" xmlns: context=http: //www.springframework.org/schema/context —命名空间- xsi: schemaLocation="http: //www.springframework.org/schema/beans http: //www.springframework.org/schema/context《 --schema文件--> http: //www.springframework.org/schema/context/spring-context-2.5.xsdhttp: //www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 2、 component-scanbase-package="package"/>//打开自动扫描器 其中base-package为需要扫描的包(含子包),可以注册基本上所有的注解处理器。 3、使用注解方式标注哪些类将要交给spring管理,它的作用和在xml文件中定义bean是一样的。 4、在类中的注解方式有四个(在类上标注): @Service用于标注业务层组件、 @Controller用于标注控制层组件(如struts中的action)、 @Repository用于标注数据访问组件,即DAO组件。 @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 4、这时bean的名称默认的为类名并将首字母改为小写,当然我们可以通过设置bean的名称来获得值(@Service(“name”)),并且可以在类上通过@scope(“prototype”)注解设置bean的作用域范围 5、初始化方法注解: @PostConstruct(javaee提供),在方法上面指定这个注解,表示该方法在初始化时执行。 6、销毁方法注解: @PreDestroy,在销毁时要执行的方法上面标记 AOP 一、AOP中的概念: Aspect(切面): 指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象。 (将要对那些方法进行拦截,拦截后将要做什么,这些就是所谓的横切性关注点) Joinpoint(连接点): 所谓连接点是指那些被拦截到的点,在spring中,这些点指的是方法。 (既拦截的方法),spring中只支持方法类型的连接点。 Pointcut(切入点): 切入点是指我们要对那些joinpoint进行拦截的定义,(既对那些方法进行拦截) 添加命名空间: Advice(通知): 通知是指拦截到joinpoint之后所要做的事情。 通知分为: 前置通知(拦截到的方法执行前执行)、后置通知(拦截到的方法执行后执行)、异常通知(当拦截到的方法出现异常时执行)、最终通知(无论方法是否出现异常都会执行)及环绕通知(方法执行前、后都可以执行) Target(目标对象): 代理的目标对象 Weave(织入): 将aspect应用到target对象并导致proxy对象创建的过程 Introduction(引入): 在不修改类代码的前提下,Introduction可以在运行期为类(代理类)动态地添加一些方法或Field. 引入命名空间 //www.springframework.org/schema/beans" xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance" xmlns: aop="http: //www.springframework.org/schema/aop" xsi: schemaLocation="http: //www.springframework.org/schema/beans http: //www.springframework.org/schema/beans/spring-beans-2.5.xsd http: //www.springframework.org/schema/aophttp: //www.springframework.org/schema/aop/spring-aop-2.5.xsd"> Spring提供了两种切面声明方式,实际开发中我们可以选用其中一种: ●基于XML配置方式声明切面。 ●基于注解方式声明切面。 一、注解方式: 1、注册AOP注解的处理类。 aspectj-autoproxy/> 2、使用注解定义切面(定义类,切面类中包含切入点) 3、只用注解定义切入点(定义类中的方法) 4、将切面交给spring进行管理 Interceptor.java(切面类) packageorg.springaop.service.impl; importorg.aspectj.lang.ProceedingJoinPoint; importorg.aspectj.lang.annotation.After; importorg.aspectj.lang.annotation.AfterReturning; importorg.aspectj.lang.annotation.AfterThrowing; importorg.aspectj.lang.annotation.Around; importorg.aspectj.lang.annotation.Aspect; importorg.aspectj.lang.annotation.Before; importorg.aspectj.lang.annotation.Pointcut; /** *定义切面 * ***/ @Aspect//将类声明为切面 publicclassMyInterceptor{ /**定义切入点*/ @Pointcut("execution(*org.springaop.service.impl.PersonServiceImpl.*(..))")//定义切入点表达式,表示将要对那些方法类中的方法进行拦截 //声明切入点的名称,声明方法和定义一个方法类似,切入点的名称myPoint privatevoidmyPoint(){} /**定义前置通知 @Before("myPoint()") publicvoidbeforeDemo(){ System.out.println("前置通知"); } */ /**后置通知**/ @AfterReturning("myPoint()") publicvoidafterReturningDemo(){ System.out.println("后置通知"); } /***最终通知*/ @After("myPoint()") publicvoidafterDemo(){ System.out.println("最终通知"); } /**例外通知*/ @AfterThrowing("myPoint()") publicvoidafterThrowingDemo(){ System.out.println("例外通知"); } /** *获得输入参数的通知 *注解中的参数名称和方法声明的参数名称一致, *而且这时只能拦截到存在一个参数并且参数类型为String类型的方法 **/ @Before("myPoint()&&args(uname)") publicvoiddoBefore(Stringuname){ System.out.println("前置通知获得输入参数: "+uname); } /** *获得返回值的通知 * ***/ @AfterReturning(pointcut="myPoint()",returning="result") publicvoiddoAfterReturning(Stringresult){ System.out.println("获得返回值的后置通知: "+result); } /** *获得异常信息的通知 **/ @AfterThrowing(pointcut="myPoint()",throwing="e") publicvoiddoAfterThrowing(Exceptione){ System.out.println("获得异常: "+e); } /** *环绕通知 *环绕通知的方法声明部分是固定的,只有方法名和访问权限可以改变 *@throwsThrow
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Spring 详细 讲解