zoukankan      html  css  js  c++  java
  • spring入门

     

     

     

     

     

     

     

     

    Spring 简介

    什么是 spring :

      1、Spring是一个轻量级的DI/IoC和AOP容器的开源框架,来源于Rod Johnson 在其著作《Expert one on one J2EE design and development》中阐述的部分理念和原型衍生而来。

      2、Spring提倡以”最少侵入”的方式来管理应用中的代码,这意味着我们可以随时安装或卸载Spring。

    使用范围:

      任何Java应用 Spring根本使命:简化Java开发 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,致力于构建轻量级的JavaEE应用

    Spring中常见术语:

      1、应用程序(application):是能完成我们所需要功能的成品,比如购物网站、OA系统。

      2、框架:是能完成一定功能的半成品,比如我们可以使用框架进行购物网站开发;框架做一部分功能,我们自己做一部分功能,这样应用程序就创建出来了。而且框架规定了你在开发应用程序时的整体架构,提供了一些基础功能,还规定了类和对象的如何创建、如何协作等,从而简化我们开发,让我们专注于业务逻辑开发。

       3、非侵入式设计:从框架角度可以这样理解,无需继承框架提供的类,这种设计就可以看作是非侵入式设计,如果继承了这些框架类,就是侵入设计,如果以后想更换框架之前写过的代码几乎无法重用,如果非侵入式设计则之前写过的代码仍然可以继续使用。

      4、轻量级及重量级:轻量级是相对于重量级而言的,轻量级一般就是非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反。

      5、POJO:POJO(Plain Old Java Objects)简单的Java对象,它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色且不继承或不实现任何其它Java框架的类或接口。

      6、容器:在日常生活中容器就是一种盛放东西的器具,从程序设计角度看就是装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期。

    Spring的优点:

       1.低侵入/低耦合(降低组件之间的耦合度,实现软件各层之间的解耦。)

       2.声明式事务管理

       3.方便集成其他框架

       4.降低JavaEE开发难度

       5.Spring框架中包括JavaEE 三层(表现层,业务层,持久层)的每一层的解决方案


    Ioc和DI介绍

    IoC:Inverse of Control(控制反转):

    读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,好比于MVC。就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。

    正控:若调用者需要使用某个对象,其自身就得负责该对象的创建。

    反控:调用者只管负责从Spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架。

    ----------------------------------------------------------------------------

    DI:Dependency Injection(依赖注入)

    从字面上分析:

    IoC:指将对象的创建权,反转给了Spring容器;

    DI :指Spring创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象。

    IoC和DI其实是同一个概念的不同角度描述,DI相对IoC而言,明确描述了“被注入对象依赖IoC容器配置依赖对象”。

    Container:容器,在生活中容器就是一种盛放东西的器皿,从程序设计角度看作是装对象的对象,因为存在对对象的存入、取出等操作,所以容器还要管理对象的生命周期。


     

    spring的基本配置

    在Spring配置中,id和name属性都可以定义bean元素的名称,不同的是

    id属性,遵守XML语法ID约束。必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号,不能以“/”开头。(ps:一般以对象名称小写作为ID)

    name属性,就可以使用很多特殊字符,比如在Spring和Struts1或Spring MVC的整合中,就得使用name属性来的定义bean的名称。(用的比较少)

    当然也使用name属性为<bean/>元素起多个别名,多个别名之间使用逗号或空格隔开,在代码中依然使用BeanFactory对象.getBean(...)方法获取。

    <bean id="loginUser" name="hi,hi2" class="com.spring.day01.model.LoginUser">

    或则

    <bean id="loginUser" name="hi hi2" class="com.spring.day01.model.LoginUser">

    建议:bean起名尽量规范,不要搞一些非主流的名字,尽量使用id。

    在spring中引入其他配置文件:

    在实际开发中,随着应用规模的增加,系统中<bean>元素配置的数量也会大量增加,导致applicationContext.xml配置文件变得非常臃肿。

    为了避免applicationContext.xml文件过于庞大、臃肿,为提高其可读性,我们可以将一个applicationContext.xml文件分解成多个配置文件,然后在applicationContext.xml文件中包含其他配置文件即可。

    使用import元素引入其他的配置文件:

    <import resource="classpath:helloWord/helloWord.xml"/>

    使用import元素注意:

    1、默认情况下,从classpath的跟路径寻找。

    2、可以使用前缀来定位文件的基础位置:

      ①:[classpath:]:后面的文件从classpath路径开始找(推荐);

      ②:[file:]:后面的文件使用文件系统的路径开(千万别用);

      注意:一般的,当框架中实现了Resource接口才能够识别上述的前缀标识符。

    使用Spring测试准备:

    依赖jar:

      Spring4.x需要依赖的单元测试得是最新的junit4.12,

      Eclipse自带的junit4.8不支持,同时从Spring4.x开始,还得依赖AOP包的支持。

        junit-4.12.jar hamcrest-core-1.3.jar

        spring-test-4.1.2.RELEASE.jar

        spring-context-4.1.2.RELEASE.jar

        spring-aop-4.1.2.RELEASE.jar

        spring-expression-4.1.2.RELEASE.jar

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--把Ticket类交给spring管理-->
        <bean id="ticket" class="com.day2_spring.model.Ticket">
            <property name="startStation" value="成都东"/>
            <!-- collaborators and configuration for this bean go here -->
        </bean>
        <bean id="product" class="com.day2_spring.model.Product">
            <property name="productName" value="飞行堡垒"/>
            <!-- collaborators and configuration for this bean go here -->
        </bean>
        <!-- more bean definitions go here -->
    </beans>
    View Code
    package com.day2_spring.testDao;
    
    import com.day2_spring.model.Product;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    //启动spring容器,把Junit运行在容器中
    @RunWith(SpringJUnit4ClassRunner.class)
    //加载配置文件"classpath:相对路径"
    @ContextConfiguration("classpath:spring_config.xml")
    
    public class testProduct {
        //自动配置
        @Autowired
        private BeanFactory beanFactory;
        @Test
        public void testP(){
            //从spring容器中创建对象
            Product product =(Product) beanFactory.getBean( "product" );//用ID取值
            Product product1 = beanFactory.getBean( Product.class );
            Object product2 = beanFactory.getBean( "product", product );
            //使用对象
        }
    }
    test Code

     自动装配,简单的属性注入

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--把Ticket类交给spring管理-->
        <bean id="loginUser" class="com.day2_spring.model.LoginUser">
            <property name="userName" value="wuji"></property>
        </bean>
        <!-- more bean definitions go here -->
    </beans>
    XML config
    package com.day2_spring.model;
    
    
    public class LoginUser1 {
        private Integer id;
        private String userName;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    }
    model code
     java Test

    构造器参数名装配 

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--把Ticket类交给spring管理-->
        <bean id="loginUser" class="com.day2_spring.model.LoginUser1">
            <property name="userName" value="wuji"></property>
        </bean>
        <!-- more bean definitions go here -->
    </beans>
    XML config
    package com.day2_spring.model;
    
    
    public class LoginUser2 {
        private  Integer userId;
        private String userName;
        public LoginUser2(Integer userId,String userName){
            this.userId = userId;
            this.userName= userName;
        }
    
    }
    model
    package com.day2_spring.testDao;
    
    import com.day2_spring.model.LoginUser1;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:loginUser_config2.xml")
    public class testUser2 {
        @Autowired
        private BeanFactory beanFactory;
        @Test
        public void testLoginUser(){
            LoginUser1 loginUser = (LoginUser1)beanFactory.getBean( "loginUser" );
            String userName = loginUser.getUserName();
            System.out.println(userName);
        }
    }
    Test code

    构造器参数值装配

    复合型类属性注入

    //先注入子属性,再使用ref引用

     

  • 相关阅读:
    《javascript设计模式》2接口
    对css类名className的一些操作的函数
    js设计模式方法的链式调用及回调
    js设计模式封装
    ajax的封装
    js设计模式单体(Singleton)
    js设计模式继承
    metasploit
    使用 AsyncCallback 处理异步调用
    log4net 的使用
  • 原文地址:https://www.cnblogs.com/funkyd/p/9650584.html
Copyright © 2011-2022 走看看