zoukankan      html  css  js  c++  java
  • 【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方法的返回值
    
  • 相关阅读:
    一道编程面试题
    AtCoder Grand Contest 016 B
    AtCoder Regular Contest 076 D
    Codeforces Round #419 (Div. 2) B. Karen and Coffee
    2017 计蒜之道 复赛 Windows画图+百度地图导航
    Codeforces Round #418 (Div. 2) B. An express train to reveries
    棠梨煎雪
    Bits And Pieces
    Let Them Slide
    TeaTree
  • 原文地址:https://www.cnblogs.com/jwnming/p/13635085.html
Copyright © 2011-2022 走看看