String学习笔记(一)
一、什么是Spring
- Spring
是一个开源框架,Spring是于2003年兴起的一个轻量级开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开元框架 - Spring:SE/EE开发的一站式框架。一站式框架:有EE开发的每一层解决方案。
WEB层 :SpringMVC
Service层 :Spring的Bean管理,Spring声明式事务
DAO层 :Spring的Jdbc模板,Spring的ORM模块
二、Spring的优点
- 方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。 - AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。 - 声明事物的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。 - 方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。 - 方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。 - 降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。 - Java 源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
三、Spring的IOC
-
IOC: Inversion of Control(控制反转)
控制反转:将对象的创建权交给Spring。 -
Spring的开发包
docs :Spring的开发规范和API
libs :Spring的开发的jar和源码
schema :Spring的配置文件的约束 -
创建web项目,导入jar包
-
创建接口和类
-
将实现类交给Spring管理
在Spring解压路径中找到:spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html中的the beans schema
//bean1.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Spring配置 -->
<bean id = userDao class = "com.spring.UserDaoImpl"></bean>
</beans>
- 编写测试类
@Test
public void test1() {
ApplicationContext context = new ApplicationContext("bean1.xml");
UserDao userDao = (UserDao ) context.getBean("UserDao ");
userDao .save();
-
IOC与DI
IOC:控制反转,将对象的创建权反转给了Spring。
DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
面向对象的时候- 依赖
Class A{
}
Class B{
public void xxx(A a){
}
} -
继承:is a
Class A{
}
Class B extends A{
} -
聚合:has a
四、Spring的工厂类
ApplicationContext继承BeanFactory
-
BeanFactory:老版本的工厂类
BeanFactory:调用getBean的时候,才会生成类的实例。 -
ApplicationContext :新版本的工厂类
ApplicationContext:加载配置文件的时候,就会将Spring管理的类都实例化。
两个实现类: -
ClassPathXmlApplicationContext :加载类路径下的配置文件
-
FileSystemXmlApplicationContext :加载文件系统下的配置文件
五、Spring的配置
-
Schema的配置
-
Bean的配置
标签的id和name的配置
id :使用了约束中的唯一约束。里面不能出现特殊字符的。
name :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。 -
Bean的生命周期的配置(了解)
init-method :Bean被初始化的时候执行的方法
destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭) -
Bean的作用范围的配置(重点)
scope :Bean的作用范围
singleton :默认的,Spring会采用单例模式创建这个对象。
prototype :多例模式。(Struts2和Spring整合一定会用到)
request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
六、Spring的Bean管理(XML方式)
- Spring的Bean的实例化方式(了解)
- 无参构造方法方式(默认)
//创建无参构造方法
public class Bean1 {
public Bean1() {
super();
System.out.println("Bean1中的无参构造方法---")
}
}
<bean id = bean1class = "com.spring.Bean1"></bean>
- 静态工厂实例化方式
//编写Bean1的静态工厂
public class Bean2Factory {
public static Bean2 createBean1() {
System.out.println("Bean2Factory执行了");
return new Bean2();
}
}
静态工厂实例化
<bean id = bean2 class = "com.spring. Bean2Factory" factory-method="createBean2"></bean>
- 实例工厂实例化的方式
//编写Bean1的静态工厂
public class Bean3Factory {
public static Bean3 createBean3() {
System.out.println("Bean3Factory执行了");
return new Bean3();
}
}
<bean id = bean3Factory class = "com.spring. Bean3Factory"></bean>
<bean id = bean3 factory-bean="bean3Factory" factory-method="createBean3"></bean>
- Spring的属性注入
- 构造方法的方式的属性注入
<bean id="car" class="com.initbean.Car">
<constructor-arg name="name" value="BW"/>
<constructor-arg name="price" value="1000000"/>
</bean>
- set方法的方式的属性注
<!-- set方法的方式 常用-->
<bean id="car2" class="com.initbean.Car2">
<property name="name" value="bc"></property>
<property name="price" value="100000"></property>
</bean>
- p名称空间的属性注入(Spring2.5以后)
通过引入p名称空间完成属性的注入:
普通属性 p:属性名=”值”
对象属性 p:属性名-ref=”值”
- p名称空间的引入
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
- 使用p名称空间
<bean id="car2" class="com.initbean.Car2" p:name="QQ" p:price="20000"></bean>
- SpEL的属性注入(Spring3.0以后)
Spring Expression Language,Spring的表达式语言。
语法:#{SpEL}
<!-- SpEL 属性注入 -->
<bean id="car2" class="com.initbean.Car2">
<property name="name" value="#{carInfo.name}"></property>
<property name="price" value="#{carInfo.price()}"></property>
</bean>
- 集合类型属性注入了解
<!-- Spring的集合属性的注入============================ -->
<!-- 注入数组类型 -->
<bean id="collectionBean" class="com.itheima.spring.demo5.CollectionBean">
<!-- 数组类型 -->
<property name="arrs">
<list>
<value>王东</value>
<value>赵洪</value>
<value>李冠希</value>
</list>
</property>
<!-- 注入list集合 -->
<property name="list">
<list>
<value>李兵</value>
<value>赵如何</value>
<value>邓凤</value>
</list>
</property>
<!-- 注入set集合 -->
<property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<!-- 注入Map集合 -->
<property name="map">
<map>
<entry key="aaa" value="111"/>
<entry key="bbb" value="222"/>
<entry key="ccc" value="333"/>
</map>
</property>
</bean>