/**
问题
spring_day01
1.如果根据类型获取,配置了多个类型的话,则抛出异常 √
2.applicationContext.xml配置文件中设置约束?
3.实例化Bean的三种方式:
1.常用
2.3一些框架初始化用
在哪里使用?
4.继承中方法,属性
5.1.OGNL 主要操作struts2值栈?在动态sql中使用OGNL表达式
2.EL表达式:操作servlet相关的一些对象和相关的值
3.spEL表达式:操作bean
6.静态工厂方法和实例工厂方法的配置方法为啥不同?
*/
Spring:是分层的,javaSE/EE 一站式(full-stack),轻量级开源框架
1.javaEE分层
表现层(页面数据显示,页面跳转调度),例如jsp/servlet
业务层(业务处理和功能逻辑,事物控制),例如service
持久层(数据存取和封装,和数据库交互),例如dao,mapper
Web表现层(servlet,jsp,struct2,springmvc)
Business业务层(JavaBean,EJB(企业级JavaBean))
EIS集成层(持久层)(jdbc,hibernate,mybatis,数据库的crud操作)
2.一站式
Spring 提供了JavaEE各层的解决方案
表现层:struct1,struct2,spring MVC
业务层:Ioc,AOP,事物控制
持久层:jdbcTemplate,mybatis,springDataJpa框架(对象关系映射)整合
3.轻量级
?
Spring 的体系结构
1.Spring一个分层架构,包含约20个模块的功能要素。
Spring Framework Runtime
1.Data Access/Integration(JDBC,ORM,OXM,JMS,Transactions)
2.Web(WebSocket,Servlet,Web.Portlet)
3.core Container(Beans, Core, Context, SpEl)
4.Test, AOP, Aspecs, Instrunentation, Messaging
1.核心容器(Core Container)包括(Core, Bean, Context, EL模块)
1.core和Beans模块提供了Spring最基础的功能,这里基础概念是BeanFactory,
功能: 1.提供[IoC]和[依赖注入特性]
2.它提供对Factory模式的经典实现来消除对程序性单例模式的需要,
并真正地允许你从程序逻辑中分离出依赖关系和配置。
2.Context模块基于Core和Bean构建
3.Expression Language 表达式语言模块
2.Data Access/Integration 数据库访问/集成部分
1.JDBC模块
2.ORM模块 提供“对象/关系”映射APIs的集成层(JPA,JDO,Hibernate,iBatis)
利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”
映射
3.OXM模块,提供一个支持Object和XML进行映射的抽象层
4.JMS模块,
5.Transaction模块,支持程序通过简单声明事物管理
3.Web
1.Web模块,提供基础的Web功能,。例如多文件上传,xxxx
2.Web-Servlet模块,提供了Web应用的Model-View-Controller(MVC)实现
3.Web-Portler模块,提供了在Portler环境下的MVC的实现。
4.AOP
1.AOP模块,提供符合AOP联盟规范的面向方面的编程实现,让你可以定义如方法拦截器和切入点
2.Aspects模块,提供了AspectJ的集成
3.Instrumentation模块,提供一些类级的工具支持和ClassLoader级的实现
5.Test
1.Test模块,提供使用Junit和TestNG来测试Spring组件的支持。
# IoC控制反转的实现(Inverse of Control)
解决代码耦合问题
引入工厂(第三者),将原来在程序中手动创建管理的依赖的UserDaoImpl对象,
交给工厂来创建管理
IoC底层实现:工厂设计模式+反射机制+配置文件(xml)
# DI依赖注入的实现
DI:Dependency Injection 依赖注入,在spring框架负责创建Bean对象时,动态的将依赖
对象注入到Bean组件(简单的说,可以将另外一个Bean对象动态的注入到另外一个Bean中)
* IOC:控制反转,将对象创建管理的权利交给spring容器,对象通过spring工厂创建
* DI:在spring容器中创建管理多个对象,通过property标签,将对象注入到需要依赖的对象中
* 例如:本例中 userDao对象注入到了userService对象中,效果只要userService
* 在spring工厂创建后,userDao也同时可以被引用
/*
IOC(控制反转):
控制:控制了对象的创建管理的权利,通过spring容器(即Application),对象通过spring工厂创建
DI(依赖注入):
在applicationContext.xml容器中,使用property标签,将需要的对象依赖注入到对应的对象中。
实现的依赖对象,和被依赖对象的同时创建?
*/
Spring的工厂(了解)
# applicationContext意为应用上下文。
作用是:用来加载spring框架的配置文件,来构建Spring的工厂对象,它为Spring容器的上下文对象,也
被称为Spring容器
/*
applicationContext被称为Spring容器的上下文对象:
ApplicationContext ac = new ClassPathXmlApplicationContext("applictionContext.xml");
Object object = ac.getBean(id/name);
上:ac从配置文件中(xml)获取对像创建的相关信息.
下:通过ac创建了对象
含义:从配置文件到项目创建对象的上下文
*/
# ApplicationContext 只是 BeanFactory(Bean工厂,Bean就是一个java对象) 一个子接口
# ApplicationContext 是对 BeanFactory 扩展 ,提供了更多的功能
# BeanFactory 采取的是延迟加载,第一次getBean时才会初始化
用法:
BeanFactory bf = new XmlBeanFactory(new FileSystemResource(D:\\applicationContext.xml"));
# ApplicationContext 更为强大,所以现在开发基本没人使用BeanFactory.
# 实例化Bean的三种方式
/*
1.无参构造器
上述所有bean的实例的方式
2.静态工厂方法
1.创建一个BeanFactory类
里面有这一个静态方法:用来返回对象的实例(当配置文件引用到静态工厂类时,当指定
factory-method=“工厂类中静态方法”,自动调用该静态方法,返回对象的实例)
用途:spring容器在实例化工厂类的时候,即可以初始化其他对象的代码?
3.实例工厂方法
1.创建工厂类
里面是一个普通方法,用来返回对象的实例
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"/>
当要在spring中调用bean3时,相当于引用了bean3Factry,再调用其中的getBean3方法
返回示例对象,从而实现了bean3的实例化
个人:静态工厂方法和实例工厂方法的配置方法为啥不同:
不同点:
1.静态工厂是直接将自己的全路径类名,给需要实例化的bean,再调用自己的静态方法。
2.实例工厂是当反射创建bean时,bean引用了实例工厂类来实例化对象。
*/
# Bean 的作用域
由spring创建的bean对象在什么情况下有效
类别 singleton:在Spring IoC 容器中仅存在一个Bean实例,Bean以单例方式存在
prototype:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,都相当于执行
new XxxBean()
/*
总结:singleton:单例,在spring容器初始化,时bean初始化,每次获取的对象都是同一个值
prototype:多例,在getBean的时候初始化,每次获取的bean不是同一个值。
注意:singleton单例类型,即使是没有调用getBean创建该类的对象,该对象也会初始化值。
初始化的体现,构造函数的执行
原因:在spring容器初始化的时候,singleton单例类型的bean就已经初始化
*/
# Bean的生命周期
/*
在xml配置文件中指定bean中初始化,销毁的方法
生命周期必然包括(初始化,销毁)
初始化:xml:init-method = "对应bean中的初始化方法名"
销毁:xml:destroy-method = "对应bean中的销毁方法名"
注意:只有作用域类型为singleton单例类型的bean才可以手动调用方法删除
*/
# Bean属性的依赖注入
/*
2种方式(构造器注入,setter属性注入)
1.构造器
标签<constructor-arg>
2.setter属性
标签<property>
<ref>赋值的对象时bean
简单地说:就是初始化时,给需要的bean赋值
*/
# p名称空间的使用
/*
spring2.5版本开始引入的新的p名称空间
基于setter属性依赖注入中的property标签的改进
通过在beans标签引用xmlns:p="http://www.springframework.org/schema/p"
通过特定的规则
p:<属性名>="xxx" 引入常量值
p:<属性名>_ref="xxx" 引用其它Bean对象
来简化代替property标签
*/
# sqEL表达式
/*
spring expresion language 表达式语言
spring3.x版本的新特性
常见的用法:
#{bean} 引用bean
#{bean.value} 引用bean的属性
#{bean.function()} 引用bean的方法
运算:
#{1+1}
字符操作:
#{“tom”.toUpperCase()}
.....
使用范围:
(操作bean相关的)
applicationContext.xml配置文件内的bean标签内用来查询bean对象的数据,配合着
p名称空间使用共同为bean对象赋值。
*/
/*
DI(dependency injection);依赖注入
1、bean注入(在一个bean中注入其他bean的信息)
*本bean为标签内的bean,外bean为注入的bean对象
bean标签类使用<property> :根据类中的setter方法进行注入
name:一般为命名外bean的id/name,最终按实际在本bean中书写的setter的方法名为准
例如:本bean中setter方法的后缀名小写,如setterXxx 对应位 name:xxx.
ref : 引用一个bean对象,值为id/name
* p名称空间代替<property>标签
2、bean属性注入(在一个bean中注入信息)
a、setter注入
使用<property>标签
name:该bean的setter方法后缀名小写,如SetXxx-那么name的属性值为xxx。
value:简单的数据
ref:复杂的数据 (引用其他bean)
* p名称空间代替<property>标签
p:<属性名>="xxx" 引入常量值
p:<属性名>_ref="xxx" 引用其它Bean对象
b、constructor注入
使用<constructor-arg>
定位属性:index name type
简单赋值属性: value
复杂赋值属性: ref
*/
问题
spring_day01
1.如果根据类型获取,配置了多个类型的话,则抛出异常 √
2.applicationContext.xml配置文件中设置约束?
3.实例化Bean的三种方式:
1.常用
2.3一些框架初始化用
在哪里使用?
4.继承中方法,属性
5.1.OGNL 主要操作struts2值栈?在动态sql中使用OGNL表达式
2.EL表达式:操作servlet相关的一些对象和相关的值
3.spEL表达式:操作bean
6.静态工厂方法和实例工厂方法的配置方法为啥不同?
*/
Spring:是分层的,javaSE/EE 一站式(full-stack),轻量级开源框架
1.javaEE分层
表现层(页面数据显示,页面跳转调度),例如jsp/servlet
业务层(业务处理和功能逻辑,事物控制),例如service
持久层(数据存取和封装,和数据库交互),例如dao,mapper
Web表现层(servlet,jsp,struct2,springmvc)
Business业务层(JavaBean,EJB(企业级JavaBean))
EIS集成层(持久层)(jdbc,hibernate,mybatis,数据库的crud操作)
2.一站式
Spring 提供了JavaEE各层的解决方案
表现层:struct1,struct2,spring MVC
业务层:Ioc,AOP,事物控制
持久层:jdbcTemplate,mybatis,springDataJpa框架(对象关系映射)整合
3.轻量级
?
Spring 的体系结构
1.Spring一个分层架构,包含约20个模块的功能要素。
Spring Framework Runtime
1.Data Access/Integration(JDBC,ORM,OXM,JMS,Transactions)
2.Web(WebSocket,Servlet,Web.Portlet)
3.core Container(Beans, Core, Context, SpEl)
4.Test, AOP, Aspecs, Instrunentation, Messaging
1.核心容器(Core Container)包括(Core, Bean, Context, EL模块)
1.core和Beans模块提供了Spring最基础的功能,这里基础概念是BeanFactory,
功能: 1.提供[IoC]和[依赖注入特性]
2.它提供对Factory模式的经典实现来消除对程序性单例模式的需要,
并真正地允许你从程序逻辑中分离出依赖关系和配置。
2.Context模块基于Core和Bean构建
3.Expression Language 表达式语言模块
2.Data Access/Integration 数据库访问/集成部分
1.JDBC模块
2.ORM模块 提供“对象/关系”映射APIs的集成层(JPA,JDO,Hibernate,iBatis)
利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”
映射
3.OXM模块,提供一个支持Object和XML进行映射的抽象层
4.JMS模块,
5.Transaction模块,支持程序通过简单声明事物管理
3.Web
1.Web模块,提供基础的Web功能,。例如多文件上传,xxxx
2.Web-Servlet模块,提供了Web应用的Model-View-Controller(MVC)实现
3.Web-Portler模块,提供了在Portler环境下的MVC的实现。
4.AOP
1.AOP模块,提供符合AOP联盟规范的面向方面的编程实现,让你可以定义如方法拦截器和切入点
2.Aspects模块,提供了AspectJ的集成
3.Instrumentation模块,提供一些类级的工具支持和ClassLoader级的实现
5.Test
1.Test模块,提供使用Junit和TestNG来测试Spring组件的支持。
# IoC控制反转的实现(Inverse of Control)
解决代码耦合问题
引入工厂(第三者),将原来在程序中手动创建管理的依赖的UserDaoImpl对象,
交给工厂来创建管理
IoC底层实现:工厂设计模式+反射机制+配置文件(xml)
# DI依赖注入的实现
DI:Dependency Injection 依赖注入,在spring框架负责创建Bean对象时,动态的将依赖
对象注入到Bean组件(简单的说,可以将另外一个Bean对象动态的注入到另外一个Bean中)
* IOC:控制反转,将对象创建管理的权利交给spring容器,对象通过spring工厂创建
* DI:在spring容器中创建管理多个对象,通过property标签,将对象注入到需要依赖的对象中
* 例如:本例中 userDao对象注入到了userService对象中,效果只要userService
* 在spring工厂创建后,userDao也同时可以被引用
/*
IOC(控制反转):
控制:控制了对象的创建管理的权利,通过spring容器(即Application),对象通过spring工厂创建
DI(依赖注入):
在applicationContext.xml容器中,使用property标签,将需要的对象依赖注入到对应的对象中。
实现的依赖对象,和被依赖对象的同时创建?
*/
Spring的工厂(了解)
# applicationContext意为应用上下文。
作用是:用来加载spring框架的配置文件,来构建Spring的工厂对象,它为Spring容器的上下文对象,也
被称为Spring容器
/*
applicationContext被称为Spring容器的上下文对象:
ApplicationContext ac = new ClassPathXmlApplicationContext("applictionContext.xml");
Object object = ac.getBean(id/name);
上:ac从配置文件中(xml)获取对像创建的相关信息.
下:通过ac创建了对象
含义:从配置文件到项目创建对象的上下文
*/
# ApplicationContext 只是 BeanFactory(Bean工厂,Bean就是一个java对象) 一个子接口
# ApplicationContext 是对 BeanFactory 扩展 ,提供了更多的功能
# BeanFactory 采取的是延迟加载,第一次getBean时才会初始化
用法:
BeanFactory bf = new XmlBeanFactory(new FileSystemResource(D:\\applicationContext.xml"));
# ApplicationContext 更为强大,所以现在开发基本没人使用BeanFactory.
# 实例化Bean的三种方式
/*
1.无参构造器
上述所有bean的实例的方式
2.静态工厂方法
1.创建一个BeanFactory类
里面有这一个静态方法:用来返回对象的实例(当配置文件引用到静态工厂类时,当指定
factory-method=“工厂类中静态方法”,自动调用该静态方法,返回对象的实例)
用途:spring容器在实例化工厂类的时候,即可以初始化其他对象的代码?
3.实例工厂方法
1.创建工厂类
里面是一个普通方法,用来返回对象的实例
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"/>
当要在spring中调用bean3时,相当于引用了bean3Factry,再调用其中的getBean3方法
返回示例对象,从而实现了bean3的实例化
个人:静态工厂方法和实例工厂方法的配置方法为啥不同:
不同点:
1.静态工厂是直接将自己的全路径类名,给需要实例化的bean,再调用自己的静态方法。
2.实例工厂是当反射创建bean时,bean引用了实例工厂类来实例化对象。
*/
# Bean 的作用域
由spring创建的bean对象在什么情况下有效
类别 singleton:在Spring IoC 容器中仅存在一个Bean实例,Bean以单例方式存在
prototype:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,都相当于执行
new XxxBean()
/*
总结:singleton:单例,在spring容器初始化,时bean初始化,每次获取的对象都是同一个值
prototype:多例,在getBean的时候初始化,每次获取的bean不是同一个值。
注意:singleton单例类型,即使是没有调用getBean创建该类的对象,该对象也会初始化值。
初始化的体现,构造函数的执行
原因:在spring容器初始化的时候,singleton单例类型的bean就已经初始化
*/
# Bean的生命周期
/*
在xml配置文件中指定bean中初始化,销毁的方法
生命周期必然包括(初始化,销毁)
初始化:xml:init-method = "对应bean中的初始化方法名"
销毁:xml:destroy-method = "对应bean中的销毁方法名"
注意:只有作用域类型为singleton单例类型的bean才可以手动调用方法删除
*/
# Bean属性的依赖注入
/*
2种方式(构造器注入,setter属性注入)
1.构造器
标签<constructor-arg>
2.setter属性
标签<property>
<ref>赋值的对象时bean
简单地说:就是初始化时,给需要的bean赋值
*/
# p名称空间的使用
/*
spring2.5版本开始引入的新的p名称空间
基于setter属性依赖注入中的property标签的改进
通过在beans标签引用xmlns:p="http://www.springframework.org/schema/p"
通过特定的规则
p:<属性名>="xxx" 引入常量值
p:<属性名>_ref="xxx" 引用其它Bean对象
来简化代替property标签
*/
# sqEL表达式
/*
spring expresion language 表达式语言
spring3.x版本的新特性
常见的用法:
#{bean} 引用bean
#{bean.value} 引用bean的属性
#{bean.function()} 引用bean的方法
运算:
#{1+1}
字符操作:
#{“tom”.toUpperCase()}
.....
使用范围:
(操作bean相关的)
applicationContext.xml配置文件内的bean标签内用来查询bean对象的数据,配合着
p名称空间使用共同为bean对象赋值。
*/
/*
DI(dependency injection);依赖注入
1、bean注入(在一个bean中注入其他bean的信息)
*本bean为标签内的bean,外bean为注入的bean对象
bean标签类使用<property> :根据类中的setter方法进行注入
name:一般为命名外bean的id/name,最终按实际在本bean中书写的setter的方法名为准
例如:本bean中setter方法的后缀名小写,如setterXxx 对应位 name:xxx.
ref : 引用一个bean对象,值为id/name
* p名称空间代替<property>标签
2、bean属性注入(在一个bean中注入信息)
a、setter注入
使用<property>标签
name:该bean的setter方法后缀名小写,如SetXxx-那么name的属性值为xxx。
value:简单的数据
ref:复杂的数据 (引用其他bean)
* p名称空间代替<property>标签
p:<属性名>="xxx" 引入常量值
p:<属性名>_ref="xxx" 引用其它Bean对象
b、constructor注入
使用<constructor-arg>
定位属性:index name type
简单赋值属性: value
复杂赋值属性: ref
*/