如何学习Spring
资源网址
Spring入门到精通p26
Spring简介
Spring是一个开源框架
IOC控制反转+AOP面向切面
包含并管理应用对象的配置和生命周期,这种意义上是一种容器
为复杂的javaEE开发的春天
什么是框架
1.是什么
维基百科
制定好一套规范或者思想,在该规则下工作
2.特点
半成品
封装了特定的处理流程和逻辑
成熟不断改进的软件
3.与类库的比较
框架一般封装逻辑。高内聚
类库是松散的工具组合
框架专注一个领域
类库更倾向与通用
IOC配置和注解
1.接口
用于沟通的中介物的抽象化
实体把自己提供给外界的一种抽象化说明,用以由内部操作分离处外部沟通的方法,使其能被修改内部而不影响外界其他实体的交互方式
对应JAVA接口即声明
声明方法那些时公开的
java8 中可以拥有方法体
2.面向接口编程
结构设计 中,分清层次及调用关系,每层只向外提供一组功能接口,各层之间依赖接口而并非实现类
接口的实现的变动不影响各层间的调用,这一点在公共服务中尤为重要
面向接口编程的接口用于隐藏具体实现和实现多态的组件
3.什么是IOC
控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护
DI:依赖注入时一种实现方式
目的
创建对象并且组装对象之间的关系
获得依赖对象的过程被反转了
过程交给外部容器控制了
IOC容器运行时动态的将某种依赖关系注入到对象中
4.Spring的Bean配置
所有的对象称之为bean
applicationContext.xml
<bean>标签
id
对象的名称
class
对应的类
5.Bean的初始化
涉及的基础包
org.springframework.beans
org.springframework.context
BeanFactory提供配置结构和基本功能,加载并初始化Bean
ApplicationContext保存了Bean对象并且在Sping中广泛应用
方式
本地文件
FileSystemXmlAplicationContext context=new FileSystemXmlApplicationContext("文件所在的路径");
ClassPath
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("classpath:spring-context.xml");
Web应用中依赖servlet或者listener
listener
<listener><listener-class>org.springframework.web.context.ContextLoaderListener<listener-class></listener>
servlet
<servlet><servlet-name>context</servlet-name><servlet-class>org.springframework.web.context.ContextLoaderServlet<servlet-class><load-on-startup>1</load-on-startup></servlet>
6.Spring的常用注入方式
是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为
注入方式
设值注入
设置set注入
<bean><pr name="类里面的名称" ref="要获取的类对象,所映射的bean ID "></bean>
构造注入
<bean><constructor-arg name="类里面的名称" ref="要获取的类对象,所映射的bean ID "></bean>
设置构造函数
Bean
1.Bean配置项
Id
整个ioc的唯一标识
Class
实例化的那个类
必须的
Scope
作用域
Constructor-arguments
构造参数
Properties
设置注入
Autowiring mode
自动装配
lazy-initialization mode
懒加载
Initialization/destruction method
2.作用域(同一个容器中)
singleton
单例,指一个Bean容器只存在一份
Prototype
每次请求创建新的实例,destroy方式不生效
request:每次http请求创建一个实例且仅在当前request内有效
session 同上,但是session有效
global session:给予protlet的web中有效,在web中的话,和session一样
3.生命周期
定义
定义一个id
初始化
加载,并且配置
方法一:实现InitializingBean接口,覆盖afterPropertiesSet方法
方法二:配置<bean>ini-method属性
使用
取出一个bean
销毁
销毁这个更容器创建所有的Bean实例
配置全局的初始化和销毁方式
default-init-method
default-destory-method
Awae接口
介绍
Spring中提供了以Aware结尾的接口,实现了的接口bean在初始化后,可以获取相应的资源
自动装配
自动装配的类型
NO: 不做任何操作: 这时默认的操作
Byname: 根据属性名自动装配,此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配
byType:如果一个容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么抛出异常,并且指出不能使用byType方式进行自动装配;如果没有找到相应匹配的bean,则设么事都不发生
Constructor:与bytYpe类型相似,不过应用于构造函数
使用
beans里面声明default-autowire="装配类型"
resource
介绍
针对资源的统一接口
UrlResource:URL对应的资源,根据一个URL地址即可构建
ClassPathResource:获取类路径下的资源文件
FileSystemResource:获取文件系统里面的资源路径
ServletContextResource:ServletContext封装的资源,用于访问ServletContext环境的资源
InputStreamResource:针对输入流封装的资源
ByteArrayResource:针对字节数组封装的资源
ResourceLoad接口
提供了获取类路径的类
Bean管理的注解实现及例子
Classpath扫描与组件管理
类的自动检测与注册Bean
spring那个可以自动检测类上带有注解的bean,并且提供给bean理解
<context:annotation-config/>
<context:component-scan>包含了<context:annotation-config/>
base-package 存放要扫描的类
scoped-proxy="interface"/>
代理方式
no
interface
targetClass
@Component
通用注解
@Repository
通常用于注解DAO类,持久层
@Service
注解Service类,服务层
@Controller
注解Controller类,控制层
@Required(单词的意思必须的)
只适用于bean属性的setter方法
这个注解仅仅表示,受影响的bean属性必须在配置时被填充,通过在bean定义或通过自动装配一个明确的属性值
@AutoWired(自动的进行装备)
传统的注解setter方法
可以用于成员变量和构造器构造器
到不到合适的bean时会抛出异常
解决方法
注解属性required=true
解析那些众所周知的依赖接口
由Spring的BeanPostProcessor
子主题 6
@Qualifier
按类型自动装配可能多个bean实例的情况,可以使用Spring的@Qualifier注解缩小范围 ,也可以指定单独的构造器参数或者方法的参数
也可以注解集合类型
@Resource
通过唯一名称引用集合或者Map的bean
适用于成员变量
有一个name属性,、并且默认Spring解释该值最为被注入的bean的名称
如果没有显式的指定name,默认的名称从属性名字或者setter方法中获取
@Scope
作用域注解
@Order注解
可以让数组有序
属性value =1
也可以实现Order这个接口
@Bean
标识一个用于配置和初始化一个由SpringIOC容器管理的新对象的方法,类似XML配置的bean
可以在Spring的@Component注解的类中使用@Bean注解任何方法,仅仅是可以
注意:如果没有注解name 那么默认使用方法的名称
如果是用注解的init 和destroy要在返回的类中定义方法
<!-- 引入外部属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置C3P0连接池: -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
@ImportResource(引入资源xml)
@Value(“${jdbc.url}”)
例子
@ImportResource("classpath:applicationContext.xml")
@Value("${url}")
private String url;
@Value("${username}")
private String username;
@Value("${password}")
private String password;
基于泛型的自动装配
有个name属性显示注解后的bean名称
JSR330标准注解
需要依赖包javax.inject包
maven的引入方式
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject<artifactId>
<version>1</version>
</dependency>
JSR支持
@PostConstruct
被这个注解注解的方法会在容器加载之前执行它
@PreDestroy
会在被销毁之前执行他
@Named
与Component是等效的
使用特定的名称时 这个注解bijiaohao
@Inject
类似于@Resource
AOP
什么是AOP
Aspect Oriented Programming 的缩写,意思为面向切面编程
通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
主要功能能,日志记录,性能统计,安全控制,事务处理,异常处理
切面
AOP的实现方式(当以service为结尾)
预编译
AspectJ
运行期动态代理
SpringAOP
JboosAOP
Spring的AOP
概念
切面Aspect
一个关注点的模块化,这个关注点可能会横切多个对象
连接点 JoinPoint
程序执行过程中某个特定的点
通知Advice
在切面上某个特定的链接点上执行的动作
切入点Pointcut
匹配连接点的断言,在Aop中通知和一个切入点表达式关联
引入Inroduction
在不修改代码的前提下,为类添加新的方法和属性
目标对象 Target Object
被一个切面或者多个切面通知的对象
AOP代理 AOP proxy
AOP框架创建的对象,用来实现切面七月
织入Weaving
把切面连接其他的应用程序类型或者对象身上去,并创建一个被通知的对象
分为编译时织入,类加载时织入。执行时织入
通知Advice的类型
前置通知Before advice
在某连接点之前执行的通知,但不能阻止连接点前的执行(除非他抛出一个异常)
返回后通知After returing adice
在某连接点正常完成后执行的通知
抛出异常后通知(After throwing)
在方法抛出异常退出时执行的通知
后通知(After(finally)advice)
在某连接点退出的时候执行的通知
环绕通知(Around Advice)
包围一个连接点的通知
异常需要抛出
用途
提供了声名式的企业服务,特别是EJB的替代服务的声明
允许用户定制自己的方面,以完成OOP与AOP的互补使用
实现
纯java实现,无需特殊的编译过程,不需要控制类加载器层次
目前只支持方法执行连接点,通过Spring Bean 方法
不是为了提供最完整的AOP实现,而是侧重提供一种AOP实现与Spring IoC容器之间的整合,用于帮助解决企业应用中的常见问题
Spring AOP 不会与AspectJ竞争,从而提供综合全面的AOP解决方案
pring AOP 默认使用标准的javaSE动态代理作为AOP代理
如果一个业务对象没有实现ige接口那么实现CGLIB代理
Schema-basedAOP
介绍
Spring的所有的切面和通知器必须放在一个<aop:config>内(可以配置包含多个<aop:config>元素)
每一个<aop:config>可以包含pointtcut,advisor和aspect元素
他们必须按照这个顺序进行声明
使用了Spring的自动代理
pointcut属性
execution(public * *(..))
切入点为执行所有的public方法时
execution(* set *(..))
切入点为执行所有的set开始的方法时
execution(* com.xyz.service.AccountService.*(..))
切入点为执行AccountService类的所有方法时
execution(** com.xyz.service.AccountService.*(..))
com.xyz.service切入点为com.xyzservice包下的所有方法时
execution(* com.xyz.service.AccountService.*(..))
com.xyz.service切入点为com.xyzservice包下的所有方法时及其子方法
within(com.xyz.service.*)
用于匹配指定类型内的方法执行
this()
匹配当前AOP代理对象类型的执行方法
Sprng AOP API
AOP的基础 不得不了解
AspectJ