一、Spring 概述
1.Spring 是一个开源框架,为了解决企业应用开发的复杂性而创建的,但现在已经不止应用与企业应用
2.Spring 是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架
-从大小与开销两反面而言两反面Spring都是轻量的
-通过控制反转的技术达到解耦的目的
-提供了面向切面变成的丰富支持,允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发
-包含并管理应用对象的配置和声明周期,这个意义上是一种容器
-将简单的组件配置、组合成为复杂的应用,这个意义上是框架
3.Spring 开发应用 简单、方面、快捷 Spring
3.1框架的特点
-半成品
-封装了特定的处理流程和逻辑控制
-成熟的、不断改进的软件
框架与类库的区别
-框架一般是封装了逻辑、高内聚的、类库则是松散的工具组合
-框架专注于某一领域,类库则是更通用的
3.2为什么使用框架
-软件系统日趋复杂
-重用度高,开发效率和质量提高
-软件设计人员要专注于对领域的了解,使需求分析更充分
-易于上手,快速解决问题
二、Spring IOC
专题一 IOC
-接口及面向接口变成
-什么事IOC
-Spring的Bean配置
-Bean的初始化
两个包 1.org.springframework.beans org.springframework.context
BeanFactory 提供配置结构和基本功能,加载并初始化Bean
ApplicationContext 保存了Bean对象并在Spring中被广泛使用
ApplicationContext
-本地文件 FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("F:/worksapace/application.xml");
-Classpath ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("calsspath:spring-context.xml");
-Web应用中依赖servlet或Listener
spring 容器 加载 ioc
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
spring MVC 加载 ioc 可以不使用spring 容器
<servlet>
<servlet-name>seckill-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>seckill-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
-Spring的常用注入方式
1.IOC控制反转:控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器(Spring Container或者 Spring MVC 子容器)
负责创建和维护
-到底哪些方面的控制被反转了呢:获得依赖对象的过程被反转了 控制被反转之后,获得依赖对象的过程由自身管理变为由IOC容器主动注入
依赖注入:就是IOC容器在运行期间,动态的将某种依赖关系注入到对象之中
2.DI依赖注入 是一种实现方式
目的:创建对象并且组装对象之间的关系
特点:不关心对象的创建 只去使用
3.Spring 注入
-spring 注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为
-常用的两种注入方式
1、设值注入 就是set 通过xml配置文件进行设置
<bean id="injesctionService" class="org.seckill.dao.injection.service.InjectionServiceImpl">
<property name="injectionDao" ref="injectionDao"/>
</bean>
<bean id="injectionDao" class="org.seckill.dao.injection.dao.InjectionDaoImpl"/>
2、构造注入
<bean id="injesctionService" class="org.seckill.dao.injection.service.InjectionServiceImpl">
<constructor-arg name="injectionDao" ref="injectionDao"/>
</bean>
<bean id="injectionDao" class="org.seckill.dao.injection.dao.InjectionDaoImpl"/>
三、Spring Bean
-Bean 配置项
id:在整个ioc容器中这个bean的唯一标识
class:具体要实例化的哪个类
scope:范围
-singleon:单例,只一个Bean容器照片那个只存在一份
-protoptype:每次请求(每次使用)创建新的实例,destroy方式不生效
-request:每次http请求创建一个实例且尽在当前request内有效
-session:每次http请求创建一个实例且尽在当前session内有效
-global session:基于portlet的web中有效(portlet定义了 global session) 如果在web中,同session
constructor arguments:
Properties: 属性
Autowiring mode:自动装配模式
lazy-initialization mode:懒加载模式
Initialization/destruction method 初始化 和销毁的方法
-Bean 作用域
-singleon:单例,只一个Bean容器照片那个只存在一份
-protoptype:每次请求(每次使用)创建新的实例,destroy方式不生效
-request:每次http请求创建一个实例且尽在当前request内有效
-session:每次http请求创建一个实例且尽在当前session内有效
-global session:基于portlet的web中有效(portlet定义了 global session) 如果在web中,同session
-Bean 生命周期
1-定义
2-初始化
-实现org.springframework.beans.factory.InitalizingBean接口,覆盖afterPropertiesSet方法
Public class RedisDao implements InitalizingBean{
@Override
public void afterPropertiesSet() throws Exception{
}
}
-配置 init-method
<bean id="redisDao" class = "org.seckill.dao.RedisDao" init-method="init"/> 该类里面有个init()方法 会自动执行在创建该类时候
3-使用
4-销毁
-实现org.springframework.beans.factory.DisposableBean接口,覆盖destroy方法
Public class RedisDao implements InitalizingBean{
@Override
public void destroy() throws Exception{
}
}
-配置 init-method
<bean id="redisDao" class = "org.seckill.dao.RedisDao" destroy-method="destroy"/> 该类里面有个destroy()方法 会自动执行在创建该类时候
总结
1,默认全局的初始化和销毁方法;
2,实现接口的初始化和销毁方法;
3,配置文件中配置初始化和销毁方法;
这三个方法同时使用时,1默认的则不执行,而23两种都会执行,并且是2实现接口的方式先于配置中3的执行。
1默认的全局初始化和销毁方法可以有可以没有,有没有对配置都没有太大影响,当然如果一个bean没有采取23初始化销毁方法,
而有1默认的方法的话,这两个方法还是会执行的。即使没有,系统也不会报错。
-Bean 自动装配(Autowiring)
-No:不做任何操作
-byname:根据属性名自动装配,此选项将检查容器并根据名字查找与属性完全一致的bean,并肩器与属性自动装配
<bean id="dao" class="com.etoak.dao.DaoImpl"></bean>
//此类中有 封装的属性值 和其set方法
//或者可以通过 表头的命名空间进行配置 default-autowrie="byBane" 其他都不默认配置了
<bean id="action" class="com.etoak.action.LoginAction" init-method="init">
<property name="di" ref="dao"></property>
</bean>
-byType:如果容器中存在一个与指定属性类型相同的bean,那么将于该属性自动装配;如果存在多个该类型bean,那么抛出异常
并指出不能使用byType方式进行自动装配,如果没有找到相匹配的bean,则是么事都不发生
-Constructor:与byType方式类似,不同之处在于他应用于构造器参数如果容器中没有找到与构造器参数类型一直的bean,抛出异常
-Resources&ResourceLoader
Resources 支队于资源文件的统一接口
-UrlResource:URL对应的资源,根据一个URL地址即可构建
-ClassPathResource:获得类路径下的资源文件(也即是classpath下的)
-FileSystemResource:获取文件系统里面的资源
-ServletContextResource:ServletContext封装的资源,用于访问ServletContext环境下的资源(web相关的)
-InputStreamResource:针对输入流封装的资源
-ByteArrayResource:针对于地接数组封装的资源
ResourceLoader 加载资源的 所有的applicationContext都实现了该接口 都可以获取Resource实例
public interface ResourceLoader{
Resource getResource(String location);
}
图
开始图
1.bean 类 实现ApplicationContextAware 所有的applicationContext都实现了该接口 都可以获取Resource实例
applicationConext.getResource();有4中
测试类
-Aware 这个暂时忽略 没用到过(上面再实现Resource时候就是用Aware)
-Spring 中提供了一些以Aware结尾的接口,实现了Aware接口的bean在初始化之后,可以获取相应的资源
-通过Aware接口,可以对Spring想用资源进行操作(一定要慎重)
-为对Spring进行简单的扩展提供了方面的入口
-ApplicationContextAware 实现了此接口的类会提供 spring contxt 上下文的信息 实现类必须配置到spring的配置文件中去(bean容器加载)
-BeanNameAware 同上
-Bean管理的注解 实现及例子
-Classpath扫描与组件管理
-从Spring3.0开始,Spring JavaConfig项目提供了很多特性,包括使用Java而不是XML 定义bean,比如
@Configuration @Bean @Import @DependsOn
-@Component是Spring的通用注解 可用于任何bean
-@Repository @service @Controller是更有针对性的注解1.@Repository通常用于注解Dao类,即持久层
br/>1.@Repository通常用于注解Dao类,即持久层
br/>3.@Controller通常用于Controller类,即控制层(MVC)
注解<context:annotation-config/>
-bean的扫描类
1.测试类 注解@Scope默认单例 @Component 默认类名首字母小写(可自定义)
1.注解@Component @Repository @Service @Controller 2必须的@Required
br/>必须的@Required
自动装配@Autowried
br/>自动装配@Autowried
图片
3种注入方式
1.配置文件 扫描该包下的 4个文件 一个接口两个实现类 还有一个BeanInvoke类
2.装配的类
3.测试类和结果 装配的 list 和 map 都是泛型的实现类并且都是同一个对象(因为使用的是默认单例) BeanInterface的实现类无论是单例还是prototype 不会改变list map里面的 对象 都是同一个对象 key就是 bean id 在实现类上添加@Order(value=1) list 会进行排序小->大
我 Autowired 和Qualifier 装配 过滤一起用
在类中配置
在xml中 配置
自定义注解
使用Xml配置
-javabean 基于java的容器注解说明 通过注解@bean 或者xml 配置ben id="" class="" 效果一样
我的实验
图1实体类
图2逻辑类
图3配置(实体类不用背扫描就可以 因为他没有注解)
图4 测试结果
-1.ImportResource(读取资源) Bean value 三个注解一起使用
加载properties文件的xml
基础的类
整合效果类
结果类
-2propertySource 可以代替 ImportResource 更简单
实体类
效果整合类
测试显示 同上一样
-3 使用一个ioc容器
实体类
整合效果类
效果测试类 同上
-1Configuration和Bean 和scope
图 配置文件
实体类
效果整合类
测试结果
-1.基于泛型的自动装配
配置文件
接口类
实例1
实例2
整合效果类
测试类
-1Autowired 和 Qualifire扩展 没有例子展示
-bean 装配 spring 对 jsr标准的支持
图1这个Resource 可以对对象和 方法都可以注入 (name="",type=JsrService.class)类型和name一起确定唯一 通常使用 byName的 Autowired是byType Reource是java注解
下面是测试
配置文件
测试结果
-jsr330支持
测试 其他 同上
总结回顾
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。