Spring学习总结(一)
Spring概述
Spring 是一个开源免费并且高度灵活的轻量级框架。为了解决企业应用开发的复杂性而创建。可以一站式构建企业级应用。 Spring 再当前的j2ee项目中应用相当广泛,采用Java语言开发。 Spring 被设计为非侵入式的,意味着我们开发者的逻辑代码通常不会依赖于框架本身。也就是说依赖于Spring 的的依赖可以从代码库中分离出来。
开发者使用Spring 的好处 1.Spring 容器提供了IOC机制(DI),可以创建对象以及管理对象之间的调用关系,避免了硬编码造成的程序耦合。 2.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 3.Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于Spring 的 API 4.Spring 本身是一个容器, 它包含并且管理应用对象的生命周期 5.对于其他优秀框架的支持(如:Struts、Hibernate、MyBatis、Quartz等) 6.Spring 自身也提供了展现层的 SpringMVC 和 持久层的 Spring JDBC
Spring 功能模块划分
|
Spring 开发环境搭建
依赖jar包 <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.18.RELEASE</version> </dependency>
创建配置文件 applicationContext.xml |
Spring 开发
创建bean 配置bean 创建Spring IOC 容器对象 ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml"); 从IOC容器中获取bean 的实例 act.getBean(“XXX”); 使用bean
|
bean管理
IOC 控制反转 IOC(Inversion of Control)和DI(Dependency Injection)的区别 当一个Java实例需要另一个实例时不需要自己创建,由spring容器创建然后 注入调用者 依赖注入实现了组件之间的解耦
Spring 核心容器 核心容器是spring框架的核心,用户编写的程序文件发布到服务器后,由spring 负责管理,包含对象的初始化、函数的调用、对象的消亡等等,因此可以将 spring看作是服务器与应用程序的中间管理组件。 Spring的核心容器可以管理任何java类,容器可以初始化该类,并返回实例。 • 在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用。 • Spring提供了多种初始化容器的方式,其中最常见的是如下两种: • BeanFactory:早期的javabean工厂类实现,面向Spring本身。 • ApplicationContext:对BeanFactory扩展,提供了更多功能,面向开发者。例如:国际化处 理、事件传递、Bean自动装配等 ApplicationContext 在初始化上下文时就实例化所有单例的 Bean。
Bean 的实例化 构造器方式 <bean id="dog" class="com.ry.domain.Dog"> <constructor-arg index="0" value="旺财"></constructor-arg> <constructor-arg index="1" value="2"></constructor-arg> </bean> <bean id="dog" class="com.ry.domain.Dog"> <constructor-arg type="java.lang.String" value="旺财"></constructor-arg> <constructor-arg type="int" value="2"></constructor-arg> </bean> <bean id="dog" class="com.ry.domain.Dog"> <constructor-arg name="name" value="旺财"></constructor-arg> <constructor-arg name="age" value="2"></constructor-arg> </bean>
静态工厂模式 创建工厂类 public class Factory{ public static Dog getDog(){ return new Dog("旺财",2); } } 配置静态工厂bean <bean id="dog" class="com.ry.domain.Factory" factory-method="getDog"></bean>
普通工厂模式 创建工厂类 public class Factory{ public Dog getDog(){ return new Dog("旺财",2); } } 配置普通工厂 <bean id="dog" class="com.ry.domain.Dog" factory-bean="factory" factory-method="getDog"></bean> <bean id="factory" class="com.ry.domain.Factory" ></bean>
Bean 的属性注入 三种依赖注入属性的方式 构造器 Setter注入 工厂方法(很少使用,不推荐)
Setter注入 <bean id="dog" class="com.ry.domain.Dog"> <property name="name" value="旺财"></property> <property name="age" value="2"></property> <!-组件类型注入-> <property name="persion" ref=”persion”></property> </bean> 集合类型注入list set(类似list) public class MyList { private List<String> myList; //省略getter setter } 配置list <bean id="myList" class="com.ry.domain.MyList"> <property name="myList"> <list> <value>张三</value> <value>李四</value> <value>王五</value> </list> </property> </bean> 配置map <map> <entry key= "name" value="张三丰"></entry> <entry key="age" value= "23"></entry> </map> 集合类型注入 (类似map) <props> <prop key="ip">192.168.0.1</prop> <prop key="user">icer</prop> <prop key= "pwd">icer111</prop> </props> Bean 注入自动装配(不推荐使用) <bean id="dog" class="com.ry.domain.Dog" autowire="byType"></bean> <bean id="dog" class="com.ry.domain.Dog" autowire="byName"></bean> <bean id="dog" class="com.ry.domain.Dog" autowire="constructor"></bean>
Bean 的配置关系继承 将多个Bean相同的部分抽象为一个Bean,然后让这多个Bean继承它 <bean id="person" class="com.tjxz.spdemo.bean.Person"> <property name="name" value="格格巫"></property> </bean> <bean id="owner" abstract="true"> <!--抽象出来的bean并未指定class。 --> <property name="person" ref="person"></property> </bean> <bean id="dog" class="com.tjxz.spdemo.bean.Dog" parent="onwer"> <property name="name" value="旺财"></property> </bean> <bean id="cat" class="com.tjxz.spdemo.bean.Cat" parent="onwer"> <property name="name" value="阿兹猫"></property> </bean> 父Bean可以作为配置模板,也可以作为Bean实例。不过,如果只想把父Bean作 为不实例化的模板,那么必须把abstract属性设为true,这样spring将不会实 例化这个Bean 并不是所有在父<bean>元素里定义的属性都会被继承。例如,autowire和 dependency-check属性就不能被继承 Bean配置的继承不是类的继承,它们之间没有任何关系
Bean的懒加载和依赖 依赖 • Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好。 • 如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称。 懒加载 • 延迟初始化Bean(惰性初始化Bean)是指不提前初始化Bean,而是只有在真正使用时才创建初始化Bean. • 配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值为“true ”即可延迟初始化Bean
Bean的作用域和生命周期 作用域 singleton【默认】、prototype、request、session、globalsession Singleton 单例模式,整个Spring IOC容器中只有这一个指定bean实例 Prototype 原型模式,每getbean都会new一个新的实例。 生命周期 singleton作用域的Bean,容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为; 如果一个Bean被设置成prototype作用域,旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态。 原型模式弊端之一:Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。 Bean的销毁 • 通过实现InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法; • 通过<bean> 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的 操作方法; • 在指定方法上加上@PostConstruct或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用
|