Spring

作者: YasA | 来源:发表于2018-08-03 15:13 被阅读0次

---------- Spring ---------

(1).什么是Spring
    - Spring是一个开源的轻量级的应用开发框架。
    - 目的:简化开发企业级应用程序的开发,减少侵入性(通过配置文件尽量不靠(创建对象的方法))。 // 高侵入低耦合
    - Spring提供的ioc(输入输出控制器)和aop(面向切面)的应用,可以将组建的耦合度降至最低,及解耦,便于系统日后的维护和升级。
    - Spring为系统提供了整体的解决方案,开发者可以利用它本身提供的功能之外,也可以与第三方框架和技术整合应用。

(2).为什么用Spring
    - Spring的本质是关联软件中的对象,如何创建对象以及维护对象(对象之间的调用)之间的关系。(Spring容器创建对象)

(3).Spring容器简介
    - 在Spring中,任何的java类和javaBean都被当成bean处理,这些bean通过容器管理和应用。
    - spring 容器实现了ioc和aop机制,这些机制可以简化Bean对象的创建和Bean对象之间的解耦。
    Spring 容器有两种类型:
        1.BeanFactory(工厂类/容器) 和 ApplicationContext(应用环境)
        
(4).Spring容器的实例化
    - ApplicationContext继承自 BeanFactory 接口,拥有更多的企业级方法,推荐使用该类型。

(5).如何使用spring? 
    - 遵守spring定义的规则,基于配置和默认规则,减少代码的书写。

(6).spring容器的使用
    1.首先在容器配置文件spring-mvc.xml中添加Bean定义
      <bean id="标识符" class="Bean类型">
      ~~~
      <bean id="empdao" class="com.dao.EmpDao"/>
      ~~~

    2.在创建spring容器对象之后,调用getBean()方法获取Bean的实例(根据类型创建的对象)。
      .getBean("标识符");
      ~~~
        /*  Spring容器的实例化
         *  1.new ClassPathXmlApplicationContext() 创建容器 并 加载spring-mvc.xml文件
         *  2.通过  .getBean("对应xml的id(标识符)",转换) 调用实体类对象
         * */
        // 加载spring-mvc.xml文件
        String conf = "spring-mvc.xml";
        // new ClassPathXmlApplicationContext() 创建容器
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(conf);
        // 调用getBean()方法获取Bean的实例
        EmpDao dao = ac.getBean("empdao", EmpDao.class);
      ~~~

(7).Bean的实例化
    - Spring容器创建Bean对象的方法有以下三种;
        * 用构造器实例化
        * 用静态工厂方法实例化
        * 使用实例工厂方法实例化

(8).Bean命名
    - 在spring容器中,每个bean都需要有名字(即标识符),改名字可以<bean>元素的id或name属性严格,要求具有唯一性,不允许用"/"等特殊字符。
       所以推荐使用id做标识符。
    - bean的别名
        为已定义好的bean再增加另外一个名字的引用,可以使用<alias>指定。
        <alias name = "fromName" alias="toName" />
<bean id="empDao" class="com.dao.EmpDao" />
<alias name="empDao" alias="dao" />
(9).Bean的作用域(scope)
    - 用关键词scope指定不同类型的作用域,[singleton(单例模式),prototype(多例模式)]
      <bean id="empdao" class="com.dao.EmpDao" scope="prototype" /> // 默认是singleton(单例模式)

(10).Bean的声明周期(init-method) (destroy-method)
    - 指定初始化回调方法: init-method="init" [bean定义]
    - 指定销毁的回调方法: destroy-method="destroy"

(11).bean延迟实例化(lazy-init)
    - 在ApplicationContext实现的默认行为就是在开启时将所有的Singleton bean提前进行实例化。
    
      一个延迟初始化bean对象可以设置,lazy-init="true"
      EmpDao dao = ac.getBean("empDao", EmpDao.class);执行才会加载
    
(12).指定bean的依赖关系(depends-on)
    - 当一个bean对另一bean存在依赖关系时,可以利用<bean>元素的depends-on属性指定。
     <bean id="empDao" class="com.dao.EmpDao"/>
     <bean id="empDemo" class="com.dao.EmpDemo" depends-on="empDao"/> // empDemo依赖于empDao
    
    - 多个依赖关系
     <bean id="empDao" class="com.dao.EmpDao" depends-on="empDemo,empDemo2,..."/>

(13).容器的IOC应用
    - IOC全程 inversion of Control,控制反转。
    - IOC是指程序中对象的获取方式发生了反转,由最初的new方式创建,转变为由第三方框架和注入。
      * 第三方框架一般是通过配置方式指定注入哪一个具体实现,从而降低了对象之间的耦合度。
      * IOC具体实现;DI(依赖注入)
      * DI的基本原理:
            将一起工作具有关系的对象,通过构造方法参数或者方法参数传入建立关联,因此容器的工作就是创建Bean时注入那些依赖关系
            IOC是一种思想,DI是实现IOC的主要技术途径。
            DI主要有两种注入方式:即构造器注入和setter注入。
      * setter注入
            通过调用无参构造器或者无参static工厂方法实例化bean之后,调用该bean的setter方法,即可实现setter方式的注入。

<6-13>
//spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd     
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
        
        <!-- 
            -构造器实例化-
            init-method 指定初始化回调方法 
            destory-method 指定销毁的回调方法
            lazy-innit="true" 延迟实例化  // .getBean()执行才会加载 回调方法
         -->
        <bean id="empdao" class="com.dao.EmpDao" init-method="init" lazy-init="true"/>
        <alias name = "empdao" alias="dao" />
        <!-- 指定bean依赖关系 depends-on(依赖注入)  -->
        <bean id="empdemo" class="com.dao.EmpDemo" depends-on="empdao"/>
        
        <!-- 静态工厂实例化 -->
        <bean id="calendar" class="java.util.Calendar" factory-method="getInstance" />
        
        <!-- 实例工厂方法实例化 -->
        <bean id="calObj" class="java.util.GregorianCalendar"/>
        <bean id="dateObj" factory-bean="calObj" factory-method="getTime"/>
        
        <!-- setter注入 -->
        <bean id="setter" class="com.dao.Setter"/>
        <bean id="setterDemo" class="com.dao.SetterDemo">
            <property name="set" ref="setter"/>
        </bean>
        
        <!-- 构造器实例化 -->
        <bean id="empdao" class="com.dao.EmpDao">
            <constructor-arg index="0" ref="dbutil"/>
        </bean>
        
        <!-- 注入字符串 -->
        <bean id="dbutil" class="com.util.DBUtil">
            <property name="driver" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://localhost:3306/db_emp" />
            <property name="username" value="root" />
            <property name="password" value="root" />
        </bean>
</beans>

dao
// EmpDao

package com.dao;
import com.util.DBUtil;

public class EmpDao {
    // 声明属性
    private DBUtil util;
    //  
    public EmpDao(DBUtil util){
        this.util=util;
    }
    // 一个方法
    public void show() {
        System.out.println(util.getDriver() + "****");
    }
    // 算数方法
    public int sum(int a, int b) {
        return a + b;
    }   
}

//Setter

package com.dao;
public class Setter {
    // 算数方法
    public int sum(int a, int b) {
        return a + b;
    }
}

//SetterDemo

package com.dao;
public class SetterDemo {
    // setter 注入
    private Setter set;
    public Setter getSet() {
        return set;
    }
    public void setSet(Setter set) {
        this.set = set;
    }
    public void test(){
        int sum = set.sum(4, 4);
        System.out.println(sum);
    }
}

// 测试

package com.test;
import java.util.Date;
import java.util.GregorianCalendar;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dao.EmpDao;
import com.dao.SetterDemo;
import com.util.DBUtil;

public class test {
    public static void main(String[] args) {
        /*  Spring容器的实例化
         *  1.new ClassPathXmlApplicationContext() 创建容器 并 加载spring-mvc.xml文件
         *  2.通过  .getBean("对应xml的id(标识符)",转换) 调用实体类对象
         * */
        // 加载spring-mvc.xml文件
        String conf = "spring-mvc.xml";
        // new ClassPathXmlApplicationContext() 创建容器
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(conf);
        // 构造器方法实例化
        /*
        EmpDao dao = ac.getBean("empdao", EmpDao.class);
        int s = dao.sum(3, 4);
        System.out.println(s);
        // 测试初始化回调init (第一个执行输出)
        // 测试销毁回调destroy(不会输出 但是的确执行了销毁)
        */
        
        /*
        //bean别名(alias)
        EmpDao dao = ac.getBean("dao", EmpDao.class);
        int s = dao.sum(3, 4);
        System.out.println(s);
        */
        
        // 静态工厂方法实例化
        /*
        Calendar c = ac.getBean("calendar", Calendar.class);
        System.out.println(c.get(Calendar.DATE));
        */
        
        /*
        //实例工厂方法实例化
        Date g = ac.getBean("dateObj",Date.class);
        System.out.println(g);
        */
        
        /*
        //setter注入
        SetterDemo set = ac.getBean("setterDemo", SetterDemo.class);
        set.test();
        */
        
        /*  
        // 测试DBUtil
        DBUtil db = ac.getBean("dbutil", DBUtil.class);
        db.show();
        */
        
        /**/
        // 构造器注入
        EmpDao dao = ac.getBean("empdao", EmpDao.class);
        dao.show();
        
    }
    
}

// dbutil

package com.util;

public class DBUtil {
    // 关联字符串
    private String driver;
    private String url;
    private String username;
    private String password;
    
    public String getDriver() {
        return driver;
    }
    public void setDriver(String driver) {
        this.driver = driver;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
    // 测试
    public void show(){
        System.out.println(driver+"|"+url+"|"+username+"|"+password);
    }
}

(14).自动装配
    - SpringIOC容器可以自动装配(autowire)相互协作bean之间的关联关系,autowrire可以针对单个bean进行设置,
      autowire的方便之处在于减少xml的注入配置,在xml配置文件中,可以在bean元素使用。
      autowire属性指定自动装配规则,常用类型2种:byName(按名称匹配),byType(按类型匹配)。

(15).参数值注入
    - 注入基本值
        * <value /> 元素可以通过字符串指定属性或者构造器参数的值。容器将字符串从java.lang.String类型转化为实际的属性
          或参数类型后给Bean对象注入。

(16).注入bean对象
    - 注入bean对象,定义格式有两种。
        * 注入外部bean
        * 注入内部bean

(17).注入集合
    - 通过<list>、<set>、<map>、<props> 元素可以定义和设置与java类型中的对应List、set、Map、及Properties的属性值。
    - 注入方式:
        * 外部注入
        * 内部注入
    - 注入null或空字符串
    
(18).注入Spring表达式的值
    - Spring引入一种表达式语言,这和统一的EL在语法上相似,这种表达式语言可以用于定义基于XML和注解配置的bean,
      注入一个properties文件信息。

// DBUtil

package com.util;
public class DBUtil {
    // 测试
    public void show(){
        System.out.println("DBUtil****************");
    }
    
}

// EmpDao

package com.dao;
import com.util.DBUtil;

public class EmpDao {
    // setter注入
    private DBUtil db;
    public DBUtil getDb() {
        return db;
    }
    public void setDb(DBUtil db) {
        this.db = db;
    }
    // 调用DBUtil的方法
    public void show(){
        db.show();
    }
}

//spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd     
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
        
        <!-- 
        -自动装配-
        autowire属性指定自动装配规则,常用类型2种:byName(按名称匹配),byType(按类型匹配)
        byName:对应id (db)
        -->
        <!-- 
        <bean id="empDao" class="com.dao.EmpDao" autowire="byName"/>
        <bean id="db" class="com.util.DBUtil"/>
         -->
         
        <!-- 注入基本值 -->
        <!-- 
        <bean id="action" class="com.action.EmpAction">
            <property name="age" value="18"></property>
            <property name="name" value="name"></property>
        </bean>
         --> 
        <!-- 
        <bean id="action" class="com.action.EmpAction">
            <property name="age">
                <value>18</value>
            </property>
            <property name="name">
                <value>name</value>
            </property>
        </bean>
        -->
         
        <!-- 注入外部bean对象 -->
        <!-- 
        <bean id="dd" class="com.dao.EmpDemo"/>
        <bean id="action" class="com.action.EmpAction">
            <property name="demo" ref="dd"/>
        </bean>
        -->
         
        <!-- 注入内部bean对象 -->
        <!-- 
        <bean id="action" class="com.action.EmpAction">
            <property name="demo">
                <bean class="com.dao.EmpDemo"/>
            </property>
        </bean>
        --> 
        
        <!-- 集合注入(内部注入对象) -->
        <bean id="action" class="com.action.EmpAction">
            <!-- List集合 -->
            <property name="emps" ref="emp">
                <!-- 
                <list>
                    <value>tom/list</value>
                    <value>jack/list</value>
                </list>
                 -->
            </property>
            <!-- Set集合 -->
            <property name="ems" ref="em">
                <!-- 
                <set>
                    <value>tom/set</value>
                    <value>jack1/set</value>
                </set>
                 -->
            </property>
            
            <!-- Map集合 -->
            <property name="map" ref="ma">
                <!-- 
                <map>
                    <entry key="1001" value="Java语言基础" />
                    <entry key="1002" value="JavaWeb基础" />
                    <entry key="1003" value="Spring基础" />
                </map>
                 -->
            </property>
            
            <!-- Properties集合 -->
            <property name="pp" ref="p">
                <!-- 
                <props>
                    <prop key="url">jdbc:mysql:localhost:3306/db_emp</prop>
                </props>
                 -->
            </property>
            
            <!-- 注入null或空字符串 -->
            <!-- 
            <property name="test" value="null" />
            <property name="test">
                <null />
            </property>
             -->
             
             <!-- 注入Spring表达式 -->
             <!-- 
            <property name="name" value="#{random.username}" />
            <property name="age" value="#{random.age}" />
             -->
        </bean>
        
        <!-- List集合外部注入 -->
        <util:list id="emp">
            <value>jack</value>
            <value>tom</value>
        </util:list>
        
        <!-- Set集合外部注入 -->
        <util:set id="em">
            <value>tom</value>
            <value>jack</value>
        </util:set>
        
        <!-- Map集合外部注入 -->
        <util:map id="ma">
            <entry key="1001" value="Java语言基础" />
            <entry key="1002" value="Java Web基础" />
            <entry key="1003" value="Spring基础" />
        </util:map>
        
        <!-- Properties集合外部注入 -->
        <util:properties id="p">
            <prop key="url">jdbc:mysql:localhost:3306/db_emp</prop>
        </util:properties>
        
        <!-- 注入Spring表达式 -->
        <util:properties id="random" location="classpath:com/util/db.properties"/>
</beans>

// EmpAction

package com.action;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.springframework.stereotype.Controller;
import com.dao.EmpDemo;
@Controller
public class EmpAction {
    // 成员变量 
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    // setter 注入EmpDemo
    private EmpDemo demo;
    public EmpDemo getDemo() {
        return demo;
    }
    public void setDemo(EmpDemo demo) {
        this.demo = demo;
    }
    
    /*<注入集合>*/
    // 注入List集合
    private List<String> emps;
    public List<String> getEmps() {
        return emps;
    }
    public void setEmps(List<String> emps) {
        this.emps = emps;
    }
    
    // 注入set集合
    private Set<String> ems;
    public Set<String> getEms() {
        return ems;
    }
    public void setEms(Set<String> ems) {
        this.ems = ems;
    }
    
    // 注入map集合
    private Map<String,String> map;
    public Map<String, String> getMap() {
        return map;
    }
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
    
    // properties集合
    private Properties pp;
    public Properties getPp() {
        return pp;
    }
    public void setPp(Properties pp) {
        this.pp = pp;
    }
    
    //
    private String test;
    public String getTest() {
        return test;
    }
    public void setTest(String test) {
        this.test = test;
    }
    
    // 扫描测试
    public void dd(){
        System.out.println("ddddddddd");
    }
}

// EmpDemo

package com.dao;
public class EmpDemo {
    public void show(){
        System.out.println("&&&&&&&&&&&&&&&&&&&&");
    }
}

(19).基于注解的组件扫描
    - 什么是组件扫描?
        * 指定一个包路径,spring会自动扫描该包下及其子包下的所有组件类,当发现组件类定义前有特定的注解标记时,
          就会将该组件纳入到spring容器中。等价于原xml配置文件中的 bean定义。
            // 扫描com.dap下的所有文件
            <context: component-scan base-package="com.dao">
            
    - 自动扫描注解标记
        * 指定扫描路径后,并不是所有该路径下的组件类都被扫描到spring容器中,只有在组件类定义前有以下注解标记的
          才会被扫描spring容器中。
          
          注:当一个组件在扫描过程中被监测到时,会生成一个默认id值,默认id为小写开头的类名。
          |— — — — — — — — — — — — — — — — — — —|
          |  [注解标记]     |    [标记描述]     |
          |— — — — — — — — — — — — — — — — — — —|
          |  [ @Component ] | [ 通用注解 ]      |
          |  [ @Name ]      | [ 通用标记 ]      |
          |  [ @Repository ]| [ 持久层组件注解 ]|          
          |  [ @Service ]   | [ 业务层组件注解 ]|
          |  [ @Controller ]| [ 控制层组件注解 ]|
          |— — — — — — — — — — — — — — — — — — —|
           
    - 指定依赖注入关系
        * 具有依赖关系的Bean对象,利用@Resource[依赖注入]实现依赖关系注入。
        * @Resource 标记可以用在字段定义(成员变量)上。或者setter方法定义上。
        * 默认首先按名称匹配注入,然后按照类型匹配注入。

相关文章

网友评论

      本文标题:Spring

      本文链接:https://www.haomeiwen.com/subject/vaoyvftx.html