本篇博客是在学习Spring时所写博客,仅供参考(加自己心得想法)
目录
1.1spring是一个开源框架 轻量级 2003年兴起的 俗称一站式轻量级开源框架
1.5官网:http://spring.io/ 没有JAR的可以去官网下载
1.10 SpringIOC底层实现详解!!! 例如之前使用MYSQL 换其他数据库 可能需要改源码 现在Spring就是在帮助我们 以后无需改源码 改配置文件即可
2.2ApplicationContext和BeanFactory区别
2.3XML的自动提升 配置在celipse中wendow 查找到XML 去配置 前提你是有约束的
本人使用的是4.2版本
学习流程
- Spring第一天:Spring的概述、SpringIOC入门(XML)、Spring的Bean管理、Spring属性注入
- Spring第二天:Spring的IOC的注解方式、Spring的AOP开发(XML)
- Spring第三天:Spring的AOP的注解开发、Spring的声明式事务、JdbcTemplate。
1.Spring的基本概述
1.1spring是一个开源框架 轻量级 2003年兴起的 俗称一站式轻量级开源框架
1.2spring的好处:
1.3Spring的版本
Spring3.x和Spring4.x Spring5.x (已经出来了)
1.4Spring的IOC入门
IOC俗称"控制反转"
控制反转:将对象的创建权反转给(交给)Spring。意思把对象交给Srping容器来创建 底层会使用Spring的工厂类通过xml配置文件+反射来实现 具体后面详细介绍 不需要NEW 来创建对象了 工厂模块不清楚的可以去看看23种设计模式 PS:有的也说24种
我学spring 用了 两种模式 一个maven 一个是普通自己导入jar 出现一大堆问题(已解决PS不会的去CSDN看看大佬博客立马get到错误的点了) 主要还是JAR包问居多 建议用maven还是不错的 前提有网络 不然缺少jar 无法去中央仓库去下载
1.5官网:http://spring.io/ 没有JAR的可以去官网下载
1.6解压Spring的开发包
- docs :Spring的开发规范和API
- libs :Spring的开发的jar和源码
- schema :Spring的配置文件的约束
由于网络限制上不了QQ 无法截图 具体详细 我博客写完会把我的SpringDemo上传到CSDN 感兴趣的可以下载学习
1.7三种jar简单介绍
.jar 就是我们需要使用的Spring的jar包
javadoc.jar 是JAR包的官方文档 可以打开看看
sources.jar 是源码 感兴趣的可以把这个导入到项目中查看源码
1.8我们来创建一个WEB项目
下面是体系结构
引入包的话 目前我们首先引入上面红框框的四块jar 最基础的jar 后面使用其他的 再导入
0. 是apache提供的日志接口 --定义的都是接口规范
1.Spring的日志文件
2. 四个基本jar(最主要的!!)
1.9代码模板
创建一个接口及接口实现类
/**
* 用户管理DAO层接口
* @author jt
*
*/
public interface UserDAO {
public void save();
}
/**
* 用户管理DAO层实现类
* @author jt
*
*/
public class UserDAOImpl implements UserDAO {
private String name;
public void setName(String name) {
this.name = name;
}
public void save() {
System.out.println("UserDAOImpl执行了..."+name);
}
}
创建一个测试类
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
/**
* Spring的入门
* @author jt
*
*/
public class SpringDemo1 {
@Test
/**
* 传统方式的调用
*/
public void demo1(){
UserDAOImpl userDAO = new UserDAOImpl();
userDAO.setName("王东");
userDAO.save();
}
@Test
/**
* Spring的方式的调用
*/
public void demo2(){
// 创建Spring的工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDAO userDAO = (UserDAO) applicationContext.getBean("userDAO");
userDAO.save();
}
@Test
/**
* 加载磁盘上的配置文件
*/
public void demo3(){
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("C:\\applicationContext.xml");
UserDAO userDAO = (UserDAO) applicationContext.getBean("userDAO");
userDAO.save();
}
}
思考 这是传统方式 有什么不好的?
如果底层的实现切换了,需要修改源代码,能不能不修改程序源代码对程序进行扩展?
那么就引入了Spring的IOC底层实现
以前想创建对象 用传统方式 需要实现类 或者接口方式
问题2 面向接口编程的优缺点?(想深入研究去看大佬博客)
多态 方便程序的扩展 缺点 有耦合 联系过紧 需要改底层源代码
OCP原则认为:一个软件应该对扩展开放,对修改关闭。设计模式原则 这个很重要 我现在也是了解个皮毛
好的程序设计 应该满足OCP(设计模式) 尽量不修改底层源码的情况下对程序做扩展
1.10 SpringIOC底层实现详解!!! 例如之前使用MYSQL 换其他数据库 可能需要改源码 现在Spring就是在帮助我们 以后无需改源码 改配置文件即可
工厂模式------>
applicationContext.xml的配置(默认名字) 上面是Bean的约束 可以去Spring查找的复制过来
上面是如何写Bean的约束 不清楚的可以百度
2.0 DI和IOC的区别
IOC:控制反转,将对象的创建权反转给了Spring。
DI:依赖注入(DI的前提是IOC的环境 才可以使用DI )前提必须有IOC的环境,
Spring管理这个类的时候将类的依赖的属性注入(设置)进来
2.1依赖 B中有A
Class A{}
Class B{
public void xxx(A a){}}
继承:is a 父子
Class A{}
Class B extends A{}
聚合:has a 包含
2.1 Spring的工厂类
Spring工厂类的结构图
ApplicationContext继承BeanFactory。
2.2ApplicationContext和BeanFactory区别
- BeanFactory:调用getBean的时候,才会生成类的实例。
- ApplicationContext :新版本的工厂类 子类比父类的功能更多 目前子类使用居多
- ApplicationContext:加载配置文件的时候,就会将Spring管理的类都实例化。(单例 默认是单例)
- ApplicationContext有两个实现类
- ClassPathXmlApplicationContext :加载类路径下的配置文件(通常比较常用)
- FileSystemXmlApplicationContext :加载文件系统下的配置文件
个人理解 第一个 可以认为 是相对路径 默认查找Src路径下的配置文件 第二个是绝对路径 包含本地磁盘的路径
2.3XML的自动提升 配置在celipse中wendow 查找到XML 去配置 前提你是有约束的
2.4Bean的相关的配置
- id :使用了约束中的唯一约束。里面不能出现特殊字符的。
- name :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。
2.5Bean的生命周期的配置(了解)
- init-method :Bean被初始化的时候执行的方法
- destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭
<!-- Spring的sBean的生命周期的配置=========== -->
<!-- <bean id="customerDAO" class="com.itheima.spring.demo2.CustomerDAOImpl" scope="prototype" init-method="setup" destroy-method="destroy"/> -->
PS: 个人认为
- 在默认单例模式情况下 关闭工厂就会销毁而且每创建产生的地址都相同
- 多例的情况下 不会销毁 而且每创建产生的地址都不相同
2.6Bean的作用范围的配置(重点)
- scope :Bean的作用范围
- singleton :默认的,Spring会采用单例模式创建这个对象。
- prototype :多例模式。(Struts2和Spring整合一定会用到)
- request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
- session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
- globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
2.7Spring的Bean的实例化方式(了解)
Bean已经都交给Spring管理,Spring创建这些类的时候,有几种方式:
无参构造方法的方式(默认)
静态工厂实例化的方式
实例工厂实例化的方式
Spring的属性注入
Set方法的方式的属性注入
P名称空间的属性注入(Spring2.5以后)
- 写法:
- 对象属性 p:属性名-ref=”值”
- 普通属性 p:属性名=”值”
SpEL的属性注入(Spring3.0以后)
- SpEL:Spring Expression Language,Spring的表达式语言。
- 语法:
- #{SpEL}
- 语法:
集合类型属性注入(了解)
<!-- 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>
Spring的IOC的注解开发
- 注解的入门
- 引入aop的包
- 引入context约束
- <context:component-scan />
- 使用注解开发
- @Component :定义Bean
- @Controller :WEB层
- @Service :Service层
- @Repository :DAO层
- 属性注入:
- 普通属性 :@Value
- 对象属性 :@Resource
- @Autowired :按类型注入属性,按名称@Qulifier
- @Component :定义Bean
- XML方式和注解方式比较
- XML方式 :适用性更广,结构更加清晰。
- 注解方式 :适用类是自己定义,开发更方便。
- XML和注解的整合开发
- XML定义类
- 注解属性注入