Spring----初识spring第一弹

spring是我接触的第一个框架,看完一遍视频之后,还是有点懵懵懂懂,想写下来整理一下自己的思路。

以下正文

 

EE开发分成三层结构:

  WEB Service Dao
常用框架 struts2+jsp JavaBean Hibernate
spring使用范围 Spring MVC Bean管理(IOC) Spring的JDBC模板。ORM模板用于整合其他的持久层框架

 

 



 

一、介绍spring

spring负责管理项目中的所有对象,属于容器性质的,容器中装什么对象就有什么功能,spring不仅不排斥各种优秀的开源框架,它还提供了很多对各种优秀框架的直接支持,可以帮助其他框架管理对象。【简单的说spring是 一个分层的JavaSE/EE full-stack(一站式)轻量级(根据依赖的环境)开源框架。spring的核心是控制反转(IOC)和面向切面(AOP)。

  • AOP支持
  • IOC思想
  • spring jdbc
  • AOP事务
  • junit测试支持

二、spring的概念

思想:

  1. IOC:控制反转(Inverse Of Control)
    反转了对象的创建方式,从我们自己创建反转成程序创建
  2. DI:依赖注入(Dependency Injection)
    实现IOC思想需要DI做支持
    注入方式:
           set方法注入
           构造方法注入
           字段注入
    注入类型:
            值类型注入(8大基本数据类型)
            引用类型注入(将依赖对象注入)
  3. ApplicationContext & BeanFactory
    BeanFactory接口:
             是spring的原始接口,针对原始接口的实现类功能较为单一
             BeanFactory接口实现类的容器,特点是每次在获得对象时才会创建对象
    ApplicationContext:
             每次容器启动时就会创建容器中配置的所有对象,并提供更多的功能
    结论:在web开发中,使用applicationContext,在资源匮乏的环境中可以使用BeanFactory。

三、搭建spring

  新建一个Dynamic Web Project

  1. 导包
    将下载的spring框架的压缩包解压,以(spring-framework-4.2.4.RELEASE)这个版本为例。打开libs目录,找到需要导入的包进行复制,粘贴在自己工程目录下的lib目录下(WebContent->WEB-INF->lib)。注:解压目录中,docs是文档,libs里是jar包,schema是约束文件。根据下图寻找需要导入的包。
  2. 创建对象
    目的:让spring装起来。
    新建一个User.java文件
    package bean;
    
    public class User {
    
        private String name;
        private Integer age;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
    }
  3. 书写配置,注册对象到容器中。
    1)在src目录下新建一个applicationContext.xml文件。注意:配置文件位置任意(建议放到src目录下),文件名任意(建议取名applicationContext)
    2)导入约束:
          Window->Preferences->XML Catalog;选择Add,点File System...选择schema目录下的beans里面的最新版的一个约束。
        在Keytype中选择Schema location,在Key的位置加一个斜杠,把Location最后的文件名粘过来:http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
          在配置文件的Source下写入<beans></beans>(根元素)
          切换到Design视图,选择beans右键Edit Namespaces,点击ADD,先插入一个xsi文件,ok退出;选择Specify New Namespace->Browse->Select XML Catalog entry,找到自己之前导入的约束;在Namespace Name里填入不包含文件名的部分;

    显示以下界面就表明成功了

    3)将User对象交给spring容器管理
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
    <!-- 将User对象交给spring容器管理 -->
    <!-- bean元素:使用该元素描述需要spring管理的对象 name属性:给被管理的对象起个名字,获得对象时根据该名称获得对象
    class属性:被管理对象的完整类名 -->
    <bean name="user" class="bean.User"></bean> </beans>
  4. 代码测试
    新建一个测试类Demo|
    package test;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import bean.User;
    
    public class Demo {
        @Test //ctrl+1
        public void fun1() {
            //1、创建容器对象
            ApplicationContext ac  = new ClassPathXmlApplicationContext("applicationContext.xml");
            //2、向容器要User对象
            User u = (User) ac.getBean("user");
            //3、打印User对象
            System.out.println(u);
        }
    }

 

            运行如下结果表示成功!!!

 

 

          

 

四、配置

  1. Bean元素详解
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
    <!-- 将User对象交给spring容器管理 -->
    <!-- bean元素:使用该元素描述需要spring管理的对象
         class属性:被管理对象的完整类名
         name属性:给被管理的对象起个名字,获得对象时根据该名称获得对象(名称可以重复,可以使用特殊字符,更灵活)
         id属性:与name属性一模一样(规范:名称不能重复,不可以使用特殊字符)
    尽量使用name属性
    -->
    <bean name="user" class="bean.User"></bean>
    </beans>
  2. spring三种对象创建方式
    1)空参构造
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
    
    <!-- 方式1:空参构造 
            为了方便看得清,在User类里创建一个显示的空参构造;
            public User() {
                System.out.println("hi! 我是空参构造!!!");
            }
      -->
    <bean name="user" class="bean.User"></bean>
    </beans>

    2)静态工厂构造
         新建一个静态的工厂类

    package create;
    
    import bean.User;
    
    public class User_createUser {
        public static User createUser(){
            System.out.println("静态工厂创建User");
            return new User();
        }
    }

         配置applicationContext文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
    <!-- 方式2:静态工厂构造 
                调用UserFactory的createUser方法创建名为user_create的方法放入容器    
      -->
    <bean name="user_create" 
          class="create.User_createUser" 
          factory-method="createUser"></bean>
    </beans>

         Demo类

    package test;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import bean.User;
    
    public class Demo {
        @Test //ctrl+1
        public void fun1() {
            //1、创建容器对象
            ApplicationContext ac  = new ClassPathXmlApplicationContext("applicationContext.xml");
            //2、向容器要User对象
            User u = (User) ac.getBean("user_create");
            //3、打印User对象
            System.out.println(u);
        }
    }


    3)实例工厂构造
         修改静态工厂类(注意观察和静态工厂类有什么不同)

    package create;
    import bean.User;
    
    public class User_createUser {
        public User createUser(){
            System.out.println("实例工厂创建User");
            return new User();
        }
    }

        配置applicationContext文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
    <!-- 方式3:实例工厂构造 
                先配置一个工厂对象UserFactory
                调用UserFactory对象的createUser方法创建名为user_create的对象,放入容器
      -->
    <bean name="user_create" 
          factory-bean="userFactory"
          factory-method="createUser"></bean>
          
    <bean name="userFactory" 
          class="create.User_createUser" ></bean>
    </beans>

    Demo文件和静态工厂类一样;结果:

  3. scope属性
    scope属性取值有四种,
      singleton(默认值):单例对象,被标识为单例的对象在spring容器中只会存在一个实例(大部分情况使用该属性);
           prototype:多例原型,被标识为多例的对象,每次再获得才会创建,每次创建的都是新的对象(与struts2整合的时候,ActionBean必须配置为多例);
           request:web环境下,对象与request生命周期一致;
           session:web环境下,对象与session生命周期一致;
  4. 初始化和销毁
    init-method:配置一个方法作为生命周期初始化方法,spring会在对象创建之后立即调用;(演示该属性要在User.java里写两个方法,init(){} 和 destory(){})
    destory-method:配置一个方法作为生命周期的销毁方法,spring容器在关闭前销毁所有容器中对象调用;
  5. 模块化配置
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
    
    <bean name="user"  class="create.User_createUser" ></bean>
    
    <!-- 导入其他spring文件  -->
    <import resource="路径" />
    </beans>
  6. 属性注入
    注入方式:
    1)set方法注入(最重要!):
    值注入
    为了演示在User里面创建一个toString的方法;
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
        <!-- set方式注入 -->
    <!--1、 值注入 -->
    <!-- 表明要给User对象中名为name属性注入tom值 --> <!-- 表明要给User对象中名为age属性注入值18 --> <bean name="user" class="bean.User"> <property name="name" value="lily"></property> <property name="age" value="18"></property> </bean> </beans>

    对象类型的注入
    新建一个Car类

    package inject;
    
    public class Car {
        private String name;
        private String color;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getColor() {
            return color;
        }
        public void setColor(String color) {
            this.color = color;
        }
        @Override
        public String toString() {
            return "Car [name=" + name + ", color=" + color + "]";
        }
        
    }
    package bean;

    import inject.Car;

    public class User {

        private String name;
        private Integer age;
        
        private Car car;
        
        public User() {
            System.out.println("hi! 我是空参构造!!!");
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        public Car getCar() {
            return car;
        }
        public void setCar(Car car) {
            this.car = car;
        }
        @Override
        public String toString() {
            return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
        }
    }



    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
        <!-- set方式注入 -->
        <!--1、 值注入 -->
        <!-- 表明要给User对象中名为name属性注入tom值 -->
        <!-- 表明要给User对象中名为age属性注入值18 -->
        <bean name="user" class="bean.User">
            <property name="name" value="lily"></property>
            <property name="age" value="18"></property>
            <!-- 为car属性注入下方配置的car对象 -->
            <property name="car" ref="car"></property>
        </bean>
        
        <!--2、对象类型注入 -->
        <!-- 将Car对象配置到容器中 -->
        <bean name="car" class="inject.Car">
            <property name="name" value="法拉利"></property>
            <property name="color" value="red"></property>
        </bean>
    </beans>

    结果:

    2)构造函数注入
    该类需要有有参构造,在User里创建一个有参构造;
    User类
    package bean;
    
    import inject.Car;
    
    public class User {
    
        private String name;
        private Integer age;
        
        private Car car;
        
        public User() {
            System.out.println("hi! 我是空参构造!!!");
        }
        public User(String name, Car car) {
            System.out.println("User(String name, Car car)");
            this.name = name;
            this.car = car;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        public Car getCar() {
            return car;
        }
        public void setCar(Car car) {
            this.car = car;
        }
        @Override
        public String toString() {
            return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
        }
    }

    配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
        <!-- 构造函数方式注入 -->
        <!-- 包含值注入和引用类型注入 -->
        
         <!-- 将Car对象配置到容器中 -->
        <bean name="car" class="inject.Car">
            <property name="name" value="法拉利"></property>
            <property name="color" value="red"></property>
        </bean>
        
      <!-- name属性:构造函数的参数名 -->
      <!-- index属性:构造函数的参数索引 -->
    <!-- type属性:构造函数的参数类型 -->

    <bean name="user" class="bean.User"> <constructor-arg name="name" value="jack"></constructor-arg> <constructor-arg name="car" ref="car"></constructor-arg> </bean> </beans>

    结果:

    注:当构造函数的参数一样,只是顺序不一样的时候,如何确定调用哪一个???用index来设置!
          当构造函数的参数顺序一样,参数类型不同的时候 ,如何确定调用哪一个???用type来设置!,type的值是该变量的完整类名复制过来。

    3)P名称空间注入
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
        <!-- P名称空间方式注入 ,走set方法 
                     包含值注入和引用类型注入 
             1、导入P名称空间 xmlns:p="http://www.springframework.org/schema/p"     
             2、使用p:属性完成注入
                    值类型:p:属性名="值"
                    对象类型:p:属性名 -ref="bean名称"
        -->
        
          <!-- 将Car对象配置到容器中 -->
        <bean name="car" class="inject.Car">
            <property name="name" value="法拉利"></property>
            <property name="color" value="red"></property>
        </bean>
        
        <bean name="user" class="bean.User" p:name="amy" p:age="22" p:car-ref="car"></bean> 
    </beans>

    4)spel注入

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
        
        <bean name="user1" class="bean.User">
            <property name="name" value="lily"></property>
            <property name="age" value="18"></property>
        </bean>
        
          <!-- 将Car对象配置到容器中 -->
        <bean name="car" class="inject.Car">
            <property name="name" value="法拉利"></property>
            <property name="color" value="red"></property>
        </bean>
        
        <!-- spel注入:spring Expression Language 表达式语言-->
        <!-- value="#{}" 括号里可以引用其他对象的值作为user对象的值,引用类型是不可以用spel表达式的 -->
       
        <bean name="user" class="bean.User" >
        <!--  <property name="name" value="#{}"></property> -->
        <property name="age" value="#{user1.age}"></property>
        <property name="name" value="#{user1.name}"></property>
        <property name="car" ref="car"></property>
        </bean>
        
    </beans>
  7. 复杂类型注入
    新建一个CollectionBean类   
    package inject;
    
    import java.awt.List;
    import java.util.Arrays;
    import java.util.Map;
    import java.util.Properties;
    
    public class CollectionBean {
        private Object[] arr;//数组类型注入
        private List list;//list类型注入
        private Map map;//map类型注入
        private Properties prop;//properties类型注入
        @Override
        public String toString() {
            return "CollectionBean [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", prop=" + prop
                    + "]";
        }
        public Object[] getArr() {
            return arr;
        }
        public void setArr(Object[] arr) {
            this.arr = arr;
        }
        public List getList() {
            return list;
        }
        public void setList(List list) {
            this.list = list;
        }
        public Map getMap() {
            return map;
        }
        public void setMap(Map map) {
            this.map = map;
        }
        public Properties getProp() {
            return prop;
        }
        public void setProp(Properties prop) {
            this.prop = prop;
        }
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
    
        <bean name="user1" class="bean.User">
            <property name="name" value="lily"></property>
            <property name="age" value="18"></property>
        </bean>
    
        <!-- 将Car对象配置到容器中 -->
        <bean name="car" class="inject.Car">
            <property name="name" value="法拉利"></property>
            <property name="color" value="red"></property>
        </bean>
    
        <!-- spel注入:spring Expression Language 表达式语言 -->
        <!-- value="#{}" 括号里可以引用其他对象的值作为user对象的值,引用类型是不可以用spel表达式的 -->
    
        <bean name="user" class="bean.User">
            <!-- <property name="name" value="#{}"></property> -->
            <property name="age" value="#{user1.age}"></property>
            <property name="name" value="#{user1.name}"></property>
            <property name="car" ref="car"></property>
        </bean>
    
        <!-- 复杂类型注入 -->
        <!-- array注入 -->
        <bean name="cb" class="inject.CollectionBean">
            <!-- 数组只有一个属性的情况,直接使用value/ref <property name="arr" value="amy"></property> -->
            <!-- 多个元素 -->
            <property name="arr">
                <array>
                    <value>tom</value>
                    <value>jack</value>
                    <ref bean="user" />
                </array>
            </property>
    
            <!-- List注入 -->
            <!-- 如果数组中只准备注入一个值(对象),直接使用value/ref即可 -->
            <property name="list">
                <array>
                    <value>tom</value>
                    <value>jack</value>
                    <ref bean="user" />
                </array>
            </property>
    
            <!-- Map类型注入 -->
            <property name="map">
                <map>
                    <entry key="url" value="www"></entry>
                    <entry key="classname" value-ref="user"></entry>
                    <entry key-ref="user" value-ref="user"></entry>
                </map>
            </property>
    
            <!-- properties 类型注入 -->
            <property name="prop">
                <props>
                    <prop key="driverClass">com.jdbc.mysql.Driver</prop>
                     <prop key="userName">admin</prop>
                     <prop key="password">1234</prop>
                </props>
            </property>
        </bean>
    </beans>
  8.  在WEB环境中使用spring容器
    1)导包4+2+1(spring-web)
    2)在web.xml中配置listener=>ContextLoaderListener
          配置参数,指定spring配置路径
    3)在Action中,使用工具类获得容器。
          WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)

 

posted @ 2019-02-23 15:21  珊丿  阅读(107)  评论(0)    收藏  举报