【Spring】Spring环境搭建、依赖注入

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方法的返回值
posted @ 2020-09-08 20:25  JWnMing  阅读(192)  评论(0编辑  收藏  举报