Spring 框架
1).Spring简介、Spring工厂
(1)Spring简介
简介: Spring是一个轻量级企业开发框架,核心: IOC编程,AOP编程。
IOC:[重要] I(Inverse) O(Of) C(Controll) 控制反转
概念: 将对象创建的权利,转义到(Spring)工厂中。
目的: 将对象创建的耦合,解耦和。
(2)Spring工厂
Spring工厂:
BeanFactory(接口):
ApplicationContext(接口):
ClassPathXmlApplicationContext(实现类); ----在本地环境下使用(主函数启动)
XmlWebApplication(实现类); ----在web环境下使用。(从tomcat环境启动)
Spring配置文件: 执行时会将配置文件中所有的bean加载创建赋值
applicationContext.xml 或beans.xml
2).Spring环境搭建、Spring工厂以及控制对象的创建次数(单例的懒汉式)
(1)Spring环境搭建
① 导入需要的jar
导入spring的jar
导入spring依赖的commons-loggin的jar
② 导入配置文件。
导入`aopplicationContext.xml`配置文件,src的任意目录下即可。
导入`log4j.properties`配置文件,src的根目录下。
(2)Spring工厂的使用步骤
工厂步骤
① 将类名信息注册在applicationContext.xml
bean标签的class:类名信息
bean标签的id:对应的名字 getBean(name)
<bean class="全类名" id="获得该对象使用name" scope=”创建一个或多个”>
② 编码:创建spring工厂
ApplicationContext factory = new ClassPathXmlApplicationContext(配置文件路径);
③ 编码:调用factory的getBean方法获得对象。
factory.getBean("bean标签的id");
(3)控制对象创建的次数
① 默认spring工厂创建对象的次数 1个。(创建单个,单实例)
应用: SqlSessionFactory HttpServlet DataSource(连接池) XxxService
② bean标签下的scope属性
scope="prototype" 多个
scope=”singleton” 一个 (对单例有效的属性lazy-init=”false/default”:延后创建)
应用: Action控制器(Controller) SqlSession Connection
3).Spring工厂属性注入(属性对应类型的注入方式)
(1)Spring工厂属性注入(属性赋值)
IOC思想:IOC Inverse Of Controll 反转控制(控制反转)。是将对象创建从当前代码转移到spring工厂完成
DI:Dependency Injection 依赖注入(依赖: 对象的属性),也就是给对象的属性赋值
总结[重点]:IOC/DI----反转控制/依赖注入
① 将对象创建的权利转移到spring工厂中。
② 将对象的属性赋值的权利,转移到了spring工厂中。
(2)依赖注入的编码(属性的类型)
① String+基本数据类+包装类型:
属性必须提供标准的get和set方法,配置文件如下:
<bean id="" class="">
<property name="要赋值的属性名" value="值"></property>
</bean>
或者:
<property name=””> <value>string或者int类型的值</value> </property>
② List和数组类型:
<property name="list属性名">
<list>
<value>值1</value>
<value>值2</value>
</list>
</property>
③ Map类型:
<property name="属性名">
<map>
<entry key="key1" value="value1"></entry>
<entry key="key2" value="value2"></entry>
</map>
</property>
④ Properties类型:
<property name="属性名">
<props>
<prop key="k1">值value1</prop>
<prop key="k2">值value2</prop>
</props>
</property>
⑤ 用户自定义类型
注入的属性也是一个对象类型,先将属性的对象类型注册到bean下,再在property的ref属性里引入即可
(3)赋值原理
spring配置文件属性或者标签的底层原理
① bean标签 class属性(利用发射)
<bean id="user" class="com.baizhi.demo2.User">
底层: String classstr = "com.baizhi.demo2.User";
Class clazz = Class.forName(classstr);
Object o = clazz.newInstance();
② property标签 name属性和<prop>标签的key和标签体的值
作用:给属性赋值
底层:调用的是property标签的name属性名对应的set方法【属性名首字母大写,前面添加set】
总结:property标签的赋值原理是set方法。
4).Spring工厂利用构造方法给属性注入值、特殊对象创建(例如Connection)
(1)使用有参构造方法给属性赋值(构造参数表)
<bean id="" class="">
<constructor-arg index='参数序号,从0开始' value="101"></constructor-arg>
<constructor-arg index='参数序号,从0开始' value="101"></constructor-arg>
</bean>
(2)特殊对象的创建: 如`Connection` `SqlSession` `DataSource` `SqlSessionFactory`
例:创建connection
① 加载驱动:Class.forName("oracle.jdbc.OracleDriver");
② 获得conn:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","hr","hr");
核心编码思路
思路:
① spring允许用户自己通过编写代码(实现FactoryBean接口),提供获得对象的方式
② spring获得对象,可以借助于FactoryBean的getObjec方法获得对象
编码步骤
① 自定义类,告知spring如何获得对象
public class ConnectionFactory implements FactoryBean<Connection>{
public Object getObject(){ //Spring调用getObject方法,间接获得conn并管理在spring工厂中
//获得复杂对象的代码 }
public boolean isSingleton(){ //该方法告知spring对象管理个数,true为一个,false为多个
return false; }
public Class<?> getObjectType() {return Connection.class} //获得返回对象的类型
}
② 将FactoryBean接口的实现类交给spring工厂管理
<bean id="connFactory" class="xxx.xxx.xxx.ConnectionFactory"></bean>
补充:
如果class对应的全类名实现FactoryBean接口
① bean标签作用就自动调用该类的getObject方法,获得对象,并将对象管理起来
② 该被管理起来的对象的id "connFactory"
③ 从spring工厂获得该connection对象
factory.getBean("connFactory");
作用: 获得 connFactory对应的bean标签的class对应的类的getObject方法的返回值