梳理工程项目
javaee web项目
web01
web02
...
xuezi
xueziweb
myprojects 文件夹(工作空间 .idea/workspace.xml)
spring项目
ssm项目
jt项目
创建 新的 工作文件夹
D:\Workspaces\myprojects
idea中使用 file -> open,打开该文件夹
创建 module
spring_1_base
spring_demo_1_ioc
spring_demo_2_factory
什么是框架
将公共的模块(功能)进行高级的抽取形成通用的代码包(jar)
使用:引入相应的jar包(class/工具方法),就可以使用框架的功能
实际意义:
简化了项目的开发,并且更好的扩展软件功能
Spring框架
https://spring.io/
Spring Framework 为基于 Java 的现代企业应用程序提供了一个全面的编程和配置模型——在任何类型的部署平台上。
Spring 的一个关键元素是应用程序级别的基础设施支持:Spring 专注于企业应用程序的“管道”,因此团队可以专注于应用程序级别的业务逻辑,而无需与特定部署环境建立不必要的联系。
由Rod Johnson创建的一个开源框架
Spring框架是一个开放源代码的J2EE应用程序框架,
由Rod Johnson发起,是针对bean的生命周期进行管理的 轻量级容器(lightweight container)。
Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。
因此, Spring不仅仅能应用于J2EE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。
Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
控制反转
概念:
创建对象,维护对象关系的代码编写,原先是由程序员明确编写
现在,交给第三方去完成(ApplicationMain.java)
现在,交给第三方框架来完成(Spring框架)
对象创建的控制,由自己,转交给别人了!
即:控制反转IOC
面向对象编程中的一种设计原则
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。
其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
IOC是控制反转,是思想:创建对象、维护对象之间的(依赖)关系。
DI是依赖注入,是实现方式:构造参数值注入,set方法注入
作用:
使用IOC的技术,降低了对象之间的耦合度,
后期开发迭代时,易于修改和维护。
项目 spring_demo_1_ioc 编写
Spring的坐标
创建pojo
编写application.xml
编写测试
Spring容器启动流程(bean的创建和获得)
1. Spring程序启动时,读取xml配置文件并解析
2. 当解析到<bean>标签时,会使用反射机制实例化对象
<bean id="user1" class="com.jt.pojo.User" />
3. 将实例化好的对象,保存到Spring容器中超大的Map中
id属性中的值,作为key;反射实例化出的对象作为value
4. 从容器中获取对象,就是从Map中通过id获取即可
User user = (User)contxt.getBean("user1");
IDEA中配置spring配置文件
打开 project structure
facets
选择 spring 功能中对应的工程
点击右侧 加号,选择工程中的application.xml配置文件
确定即可
创建bean:静态工厂模式
<bean id="cal1" class="com.jt.factory.StaticFactory"
factory-method="getInstance"/>
静态方法的特点:
静态方法调用时,通过类名直接调用
静态属性:
在内存中,静态属性只有一份
创建bean:实例化工厂模式
工厂是一个实例对象 ??<bean id="" class=""/>
调用:对象.普通方法() ??<bean factory-method=""/>
创建bean:使用Spring工厂创建bean
以上两种的工厂,是别人提供了,无法修改,只能按照指定方式引入使用。
可按照Spring中 FactoryBean 的要求,创建Spring工厂,
优点:<bean>声明简单;默认是单例的;
步骤1:编写工厂 MySpringFactory implmenets FactoryBean
步骤2:配置使用
<bean id="cal3" class="com.jt.factory.MySpringFactory" />
单例/非单例
默认情况下Spring容器中都是单例对象(节省空间)
非单例:
pojo中封装的是数据,张三用户 李四用户 User类不是单例的
数据源连接(java.sql.Connection)
验证码对象
service.方法 dao.方法 都是算法
届时会在自己的线程中,运行相应的算法,
因此 Spring 默认java bean都是 单例的
单例/非单例 通过scope属性来设定
scope="singleton" 默认值 单例
scope="prototype" 非单例(多例)
<bean id="user" class="com.jt.pojo.User"
scope="prototype"/>
单例对象/非单例对象创建的时机
单例对象:Spring容器启动时,就创建纳入管理
非单例对象:
Spring容器启动时,不会创建非单例的对象,
当ctx.getBean()时,才创建对象,纳入容器管理,并返回该对象
每调用一次 ctx.getBean() 方法,就会创建产生一个新的bean
懒加载 机制
懒加载是指,当用户需要获取对象时,容器才创建该对象
非单例就是懒加载;单例不是!
懒加载适用于单例方式:
默认情况下Spring容器创建单例对象就被创建,
可设置单例对象,推后延迟实例化!
<bean lazy-init="true" /> true开启懒加载
context.getBean(User.class)的使用
一般适用于:User对象是单例的情况下
容器中,就这一个java bean,通过类型到它,返回即可
如果User配置声明,是非单例的
会报错吗?不会
什么结果?产生一个实例对象
Bean的生命周期管理
实例化对象
初始化操作(资源加载、配置信息加载等)
对象的使用(对象中的功能/方法被调用)
对象销毁(用于释放资源 )
单例对象,有完整的生命周期管理
非单例对象:随用随销
在Spring容器关闭时,没有调用非单例对象的destroy()方法
注意:init()方法,被正常被调用执行!